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

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

Запись от Maks размещена 23.03.2026 в 07:58. Обновил(-а) Maks 13.04.2026 в 09:22
Показов 1931 Комментарии 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 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru