Форум программистов, компьютерный форум, киберфорум
Maks
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Контроль уникальности значений

Запись от Maks размещена 23.03.2026 в 07:58. Обновил(-а) Maks 13.04.2026 в 09:22
Показов 1857 Комментарии 0

1. Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2.
Номеклатура загружается из БП3 через обмен, заводской номер указывается вручную завскладом при выдаче шины.
Нажмите на изображение для увеличения
Название: DOC_KA2.jpg
Просмотров: 44
Размер:	76.7 Кб
ID:	11815
Реализован контроль уникальности на предмет поиска дублей как среди ранее созданных документов, так и в текущей табличной части документа.
Программный код из решения ниже размещен в модуле объекта документа.
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 Тогда 
                ЕстьОшибкиТЧ = Истина;
            КонецЕсли;
            Если НЕ РезультатЗапроса.Пустой()
                И Строка.СтатусНазначения = СтатусПостоянно Тогда
                ЕстьОшибки = Истина;
            КонецЕсли; 
        КонецЦикла;       
        Если ЕстьОшибкиТЧ Тогда
            Сообщить("Сотрудник «"+Строка.Сотрудник+"» уже присутствует в текущем документе!");
            Отказ = Истина;
        КонецЕсли;     
        Если ЕстьОшибки Тогда 
            Выборка = РезультатЗапроса.Выбрать();
            Выборка.Следующий();
            Сообщить("Сотрудник «"+Выборка.Сотрудник+"» уже назначен для другой спецтехники: «"+Выборка.Спецтехника+"», в документе «"+Выборка.Ссылка+"»!");
            Отказ = Истина;
        КонецЕсли; 
    КонецЕсли;
КонецПроцедуры
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru