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

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

Запись от Maks размещена 23.03.2026 в 07:58. Обновил(-а) Maks 13.04.2026 в 09:22
Показов 1943 Комментарии 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
Комментарии
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru