Почему при обновлении 1С:УПП появляется сообщение о переносе 8 января 2022 года и зачем добавлен ИдентификаторСтроки?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При обновлении конфигурации 1С:УПП (например, с версии 162 на 163 и выше) многие пользователи сталкиваются с необычными предупреждениями при запуске предприятия и кардинальными изменениями в коде документов. Основные вопросы вызывают сообщение о необходимости переноса выходных дней в производственном календаре и появление сложных конструкций кода с генерацией уникальных идентификаторов для строк табличных частей.

Разберем по шагам обе ситуации: выясним причину странного поведения календаря и проанализируем изменения в архитектуре УПП, связанные с учетом прослеживаемых товаров.

Производственный календарь и выходные дни в 2022 году

При первом запуске обновленной конфигурации система выдает предупреждение:

При заполнении календаря на 2022 год обнаружены государственные праздники, попадающие на выходные дни: 08 января - Новогодние каникулы. Необходимо перенести эти выходные дни на рабочие дни.

Давайте выясним причину такого сообщения. Оно напрямую связано с Постановлением Правительства РФ, регламентирующим производственный календарь на 2022 год. В том году 1 и 2 января выпали на выходные дни (субботу и воскресенье), и правительство перенесло их на 3 и 10 мая. Однако 8 января (также суббота и государственный праздник) никуда не переносилось.

Посмотрим на типовой алгоритм 1С, который обрабатывает заполнение календаря с переносами. Разработчики добавили специальное исключение для этой даты:


Функция ЗаполнениеКалендаряСПереносами(КонтрольнаяДата, ТаблицаПеренесенныхДней, Сообщать = Истина) Экспорт
    // Не все попавшие на выходные праздники подлежат переносу: 
    // в период с 1 по 8 января переносится только два праздника.
    
    // - в 2017 году 8 января переносить не надо
    НайденныйЭлемент = СписокПраздниковВВыходные.НайтиПоЗначению('20170108');
    Если НайденныйЭлемент <> Неопределено Тогда
        СписокПраздниковВВыходные.Удалить(НайденныйЭлемент);
    КонецЕсли;
    
    // - в 2022 году 8 января переносить не надо (аналогичный код должен удалять 20220108)
    
    Если Сообщать И СписокПраздниковВВыходные.Количество() > 0 Тогда
        Сообщить("При заполнении календаря на " + Формат(Год(КонтрольнаяДата),"ЧЦ=4; ЧГ=0") + " год обнаружены государственные праздники, попадающие на выходные дни:"); 
        Для Сч = 1 По СписокПраздниковВВыходные.Количество() Цикл
            Сообщить("   " + Формат(СписокПраздниковВВыходные[Сч - 1].Значение, "ДФ ='дд ММММ'") + " - " + СписокПраздниковВВыходные[Сч - 1]);
        КонецЦикла; 
        Сообщить("Необходимо перенести эти выходные дни на рабочие дни.", СтатусСообщения.Внимание);
    КонецЕсли;
КонецФункции

Наличие праздника на выходном дне без официального переноса является нестандартной ситуацией для автоматики 1С. Система выдает информационное предупреждение, чтобы бухгалтер или кадровик вручную проверил календарь. С этим ничего делать не нужно, если графики работы сотрудников совпадают с утвержденным государственным календарем, достаточно просто принять эту информацию к сведению.

Зачем старый "Ключ связи" заменили на "Идентификатор строки" (UUID)?

Проанализируем второе существенное изменение, которое бросается в глаза при отладке документов (таких как РеализацияТоваровУслуг или ТребованиеНакладная). Раньше для связи разных табличных частей (например, товаров и серий) использовался числовой реквизит КлючСвязи. Теперь вместо него появился ИдентификаторСтроки с типом "Строка (50)".

Рассмотрим код, который теперь генерирует эти идентификаторы в документах поступления и реализации:


Если СтрокаТабличнойЧасти.ИдентификаторСтроки = "0" Или СтрокаТабличнойЧасти.ИдентификаторСтроки = "" Тогда
    СтрокаТабличнойЧасти.ИдентификаторСтроки = Строка(Новый УникальныйИдентификатор);
КонецЕсли;

Почему 1С перешла на громоздкие UUID вместо обычных чисел? Главная причина — внедрение Национальной системы прослеживаемости товаров (РНПТ) и форматов электронного документооборота (ЭДО).

  1. При обмене электронными УПД через операторов ЭДО простые числовые индексы строк часто приводили к ошибкам.
  2. При загрузке или объединении документов номера строк могли сбиваться или дублироваться.
  3. Строковый UUID (например, "550e8400-e29b-41d4-a716-446655440000") гарантирует абсолютную уникальность в рамках любой базы данных.

Это позволяет жестко и без коллизий связывать конкретную строку табличной части документа с данными прослеживаемости (РНПТ, номерами ГТД) при передаче XML-файлов между контрагентами и ФНС.

Сложности адаптации кода в устаревших конфигурациях

Вместе с новыми реквизитами в 1С:УПП появились сложные алгоритмы обработки, свойственные конфигурациям на базе Библиотеки стандартных подсистем (БСП). Разберем пример процедуры очистки табличной части прослеживаемости:


Процедура ОтражатьВПрослеживаемостиПриИзменении(Элемент)
    Если Не ЭлементыФормы.ОтражатьВПрослеживаемости.Значение Тогда
        Для Каждого Строка Из Товары Цикл
            Если Строка.ПрослеживаемыйТовар Тогда
                НоваяСтрока = ТаблицаУдаленныхСтрок.Добавить();
                НоваяСтрока.ИдентификаторСтроки = Строка.ИдентификаторСтроки;
            КонецЕсли;
        КонецЦикла;
        ПодключитьОбработчикОжидания("Подключаемый_УдалитьСвязанныеЗаписи", 0.1, Истина);
    КонецЕсли;
КонецПроцедуры

Процедура Подключаемый_УдалитьСвязанныеЗаписи()
    УдалитьСвязанныеЗаписиНаСервере();
КонецПроцедуры

Процедура УдалитьСвязанныеЗаписиНаСервере()
    Для Каждого СтрокаКлюча Из ТаблицаУдаленныхСтрок Цикл
        СтруктураОтбора = Новый Структура("ИдентификаторСтроки", СтрокаКлюча.ИдентификаторСтроки);
        МассивСтрокСведенияПрослеживаемости = СведенияПрослеживаемости.НайтиСтроки(СтруктураОтбора);
        Для Каждого СтрокаТЧ Из МассивСтрокСведенияПрослеживаемости Цикл
            СведенияПрослеживаемости.Удалить(СтрокаТЧ);
        КонецЦикла;
    КонецЦикла;
    ТаблицаУдаленныхСтрок.Очистить();
КонецПроцедуры

Многих программистов возмущает, что простое удаление строк теперь выполняется через три процедуры и ПодключитьОбработчикОжидания. Причина кроется в архитектуре. 1С:УПП — устаревшая конфигурация. Чтобы оперативно поддерживать изменения в законодательстве (прослеживаемость, ЭДО, маркировка), разработчики 1С портируют готовые унифицированные блоки кода из современных конфигураций (ERP, КА, БП 3.0), построенных на управляемых формах и архитектуре клиент-серверного взаимодействия.

Эти новые блоки требуют строгого разделения логики, поэтому даже в УПП появляются обработчики, эмулирующие асинхронные вызовы и разбиение кода на клиентские и серверные процедуры. Это неизбежная плата за поддержание старой конфигурации в актуальном законодательном поле.

← На главную