1. Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2.
Номеклатура загружается из БП3 через обмен, заводской номер указывается вручную завскладом при выдаче шины.

Реализован контроль уникальности на предмет поиска дублей как среди ранее созданных документов, так и в текущей табличной части документа.
Программный код из решения ниже размещен в модуле объекта документа.
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Запрос для поиска дублей в регистре сведений "ШиныСпецтехники"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШиныСпецтехники.ЗаводскойНомер КАК ЗаводскойНомер,
| ШиныСпецтехники.Регистратор.Ссылка КАК РегистраторСсылка
|ИЗ
| РегистрСведений.ШиныСпецтехники КАК ШиныСпецтехники
|ГДЕ
| ШиныСпецтехники.ЗаводскойНомер = &ЗаводскойНомер
| И ШиныСпецтехники.Регистратор.Ссылка <> &Ссылка";
ЕстьОшибки = Ложь;
ЕстьОшибкиТЧ = Ложь;
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
Для каждого Строка Из Шины Цикл
Если Шины.НайтиСтроки(Новый Структура("ЗаводскойНомер", Строка.ЗаводскойНомер)).Количество() > 1 Тогда
ЕстьОшибкиТЧ = Истина;
Прервать;
КонецЕсли;
Запрос.УстановитьПараметр("ЗаводскойНомер", Строка.ЗаводскойНомер);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
ЕстьОшибки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Если найден дубль внутри ТЧ
Если ЕстьОшибкиТЧ Тогда
Сообщить("Введенный заводской номер '" + Строка.ЗаводскойНомер + "' уже присутствует в текущем документе.");
Отказ = Истина; // запрещаем запись документа
КонецЕсли;
// Если найден дубль в другом документе
Если ЕстьОшибки Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Сообщить("Введенный заводской номер '" + Выборка.ЗаводскойНомер + "' указан в другом документе: " + Выборка.РегистраторСсылка);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры |
|
2. Алгоритм контроля заполнения сотрудников на примере нетипового документа "ПланированиеПерсонала"", разработанного в конфигурации КА2.
| 1C | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| &НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекДата = ТекущаяДатаСеанса();
СтатусВременно = ПредопределенноеЗначение("Перечисление.СтатусСотрудникаДляТС.Временно");
СтатусПостоянно = ПредопределенноеЗначение("Перечисление.СтатусСотрудникаДляТС.Постоянно");
// Проверка наличия/отсутствия документа с такой же спецтехникой
Если ЗначениеЗаполнено(Объект.Спецтехника) Тогда
ЗапросТС = Новый Запрос;
ЗапросТС.Текст =
"ВЫБРАТЬ
| НазначениеСотрудниковТССрезПоследних.Регистратор.Ссылка КАК Ссылка
|ИЗ
| РегистрСведений.сгэНазначениеСотрудниковТС.СрезПоследних(
| &ДатаСреза,
| Регистратор.Ссылка <> &Ссылка
| И Спецтехника = &Спецтехника) КАК НазначениеСотрудниковТССрезПоследних";
ЗапросТС.УстановитьПараметр("ДатаСреза", ТекДата);
ЗапросТС.УстановитьПараметр("Спецтехника", Объект.Спецтехника);
ЗапросТС.УстановитьПараметр("Ссылка", Объект.Ссылка);
РезультатТС = ЗапросТС.Выполнить();
Если НЕ РезультатТС.Пустой() Тогда
ВыборкаТС = РезультатТС.Выбрать();
ВыборкаТС.Следующий();
Сообщить("Спецтехника «"+Объект.Спецтехника+"» уже назначена в документе: "+ВыборкаТС.Ссылка+"!");
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
// Проверка наличия/отсутствия документа с таким же сотрудником
Если Объект.Сотрудники.Количество() > 0 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НазначениеСотрудниковТССрезПоследних.Регистратор.Ссылка КАК Ссылка,
| НазначениеСотрудниковТССрезПоследних.Сотрудник КАК Сотрудник,
| НазначениеСотрудниковТССрезПоследних.Спецтехника КАК Спецтехника,
| НазначениеСотрудниковТССрезПоследних.СтатусНазначения КАК СтатусНазначения
|ИЗ
| РегистрСведений.НазначениеСотрудниковТС.СрезПоследних(
| &ДатаСреза,
| Регистратор.Ссылка <> &Ссылка
| И Сотрудник = &Сотрудник
| И СтатусНазначения <> &СтатусНазначения) КАК сгэНазначениеСотрудниковТССрезПоследних";
Запрос.УстановитьПараметр("ДатаСреза", ТекДата);
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("СтатусНазначения", СтатусВременно);
ЕстьОшибки = Ложь;
ЕстьОшибкиТЧ = Ложь;
Для каждого Строка Из Объект.Сотрудники Цикл
Запрос.УстановитьПараметр("Сотрудник", Строка.Сотрудник);
РезультатЗапроса = Запрос.Выполнить();
ПараметрыПоиска = Новый Структура("Сотрудник",Строка.Сотрудник);
РезультатПоиска = Объект.Сотрудники.НайтиСтроки(ПараметрыПоиска);
Если РезультатПоиска.Количество() > 1 Тогда
ЕстьОшибкиТЧ = Истина;
КонецЕсли;
Если НЕ РезультатЗапроса.Пустой()
И Строка.СтатусНазначения = СтатусПостоянно Тогда
ЕстьОшибки = Истина;
КонецЕсли;
КонецЦикла;
Если ЕстьОшибкиТЧ Тогда
Сообщить("Сотрудник «"+Строка.Сотрудник+"» уже присутствует в текущем документе!");
Отказ = Истина;
КонецЕсли;
Если ЕстьОшибки Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Сообщить("Сотрудник «"+Выборка.Сотрудник+"» уже назначен для другой спецтехники: «"+Выборка.Спецтехника+"», в документе «"+Выборка.Ссылка+"»!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры |
|
|