Как исправить ошибки СКД с остатками, печатью штрихкодов и интерфейсом в релизах 1С 8.3.16

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

Переход на новые релизы платформы «1С:Предприятие» — это всегда ответственный шаг, который нередко преподносит неприятные сюрпризы разработчикам и системным администраторам. Ветвь 8.3.16 (в особенности релизы 8.3.16.1030 и 8.3.16.1063) запомнилась сообществу целым рядом критических багов. Среди них: некорректный расчет остатков по регистраторам в Системе компоновки данных (СКД), прекращение работы печати штрихкодов и проблемы с отображением форм.

В этой статье мы подробно разберем причины возникновения данных неполадок и рассмотрим практические способы их обхода и полного устранения.

---

Методика 1. Исправление ошибки расчета остатков в СКД по периодам и регистраторам

Выясним причину странного поведения отчетов, использующих СКД, после обновления на релизы 8.3.16.1030/1063. Пользователи начали замечать, что типовые и доработанные отчеты (например, «Товары на складах») при группировке по полям Период или Регистратор выводят неверные данные — остатки просто суммируются по строкам, превращая отчет в хаос.

Почему это происходит?
В версии 8.3.16 разработчики 1С глубоко модернизировали механизм трансляции запросов из СКД в СУБД для оптимизации производительности. Однако это привело к критической ошибке: если в схеме компоновки данных используются виртуальные таблицы остатков (или остатков и оборотов), помещенные во временные таблицы (ВТ) или объединенные через оператор ОБЪЕДИНИТЬ, СКД «теряет» роли полей. Платформа перестает понимать, что перед ней остатки на границу периода, и выполняет банальное математическое суммирование по всем записям группировки.

Разберем по шагам, как мы можем решить эту проблему без отката на старые платформы:

  1. Обновление платформы (основной вариант). Данный баг был официально признан фирмой 1С и оперативно исправлен в последующих сборках. Рекомендуется обновить платформу до релиза 8.3.16.1148 или сразу перейти на более современные и стабильные ветки, такие как 8.3.17, 8.3.18 и старше.
  2. Отказ от использования ВТ для виртуальных таблиц. Если у вас нет возможности быстро обновить платформу на серверах компании, проанализируем структуру запроса в СКД. Избегайте конструкций, в которых виртуальные таблицы остатков помещаются во временные таблицы. Постарайтесь переписать запрос так, чтобы обращение к физическим и виртуальным таблицам происходило в конечном пакете запроса.

    Рассмотрим пример нерекомендуемой структуры запроса:

    
    ВЫБРАТЬ
        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
    ПОМЕСТИТЬ ВТ_ОстаткиТоваров
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТ_ОстаткиТоваров.Номенклатура,
        ВТ_ОстаткиТоваров.Остаток
    ИЗ
        ВТ_ОстаткиТоваров КАК ВТ_ОстаткиТоваров
    

    Рекомендуется избавиться от промежуточной ВТ и получать данные напрямую:

    
    ВЫБРАТЬ
        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
    
  3. Ручная настройка ролей полей в СКД. При использовании сложных запросов автоматическое определение ролей платформой может сбоить. Решим это вручную:
    • Откроем схему компоновки данных в конфигураторе и перейдем на вкладку «Наборы данных».
    • Снимем флаг «Автозаполнение» у проблемного набора данных.
    • В таблице полей найдем наши ресурсы остатков (начальный и конечный остаток) и вручную заполним колонку «Роль». Укажем тип «Остатки», зададим имя группы и укажем соответствующее поле периода.
    • Для полей ПериодСекунда, ПериодДень и Регистратор обязательно установим роль «Период» с указанием их иерархии (порядкового номера).

---

Методика 2. Решение проблемы с печатью штрихкодов (отказ от ActiveX)

Вторая популярная проблема при переходе на 8.3.16 — внезапное исчезновение или отказ печати штрихкодов в таких конфигурациях, как «Управление производственным предприятием» (УПП) или «Управление торговлей 10.3». Штрихкоды, которые раньше добавлялись в печатные формы через OLE-объекты, перестают выводиться на печать.

Причина сбоя:
Исторически для генерации штрихкодов использовалась внешняя библиотека 1C:Barcode Printing (1CBarCode.dll), зарегистрированная в системе как элемент управления ActiveX. Начиная с платформы 8.3.16, поддержка технологии ActiveX была существенно урезана. Более того, 64-битный клиент «1С:Предприятия» физически не способен взаимодействовать с 32-битным ActiveX-компонентом, что приводит к ошибкам при формировании табличных документов на стороне сервера.

Рассмотрим варианты исправления ситуации:

  1. Переход на Native API или встроенный механизм генерации штрихкодов 1С. Это наиболее правильный стратегический шаг. В современных версиях платформы реализован встроенный графический объект «Штрихкод». Нам больше не нужны внешние библиотеки. Чтобы использовать встроенный генератор, достаточно программно управлять типом рисунка в табличном документе.

    Посмотрим на пример кода, который заменяет использование старой ActiveX-компоненты на работу со встроенным механизмом платформы:

    
    // Пример программного добавления штрихкода в область макета без ActiveX
    ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");
    РисунокШтрихкода = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Штрихкод);
    РисунокШтрихкода.Верх = 2;
    РисунокШтрихкода.Лево = 2;
    РисунокШтрихкода.Ширина = 60;
    РисунокШтрихкода.Высота = 15;
      
    // Настройка параметров штрихкода средствами платформы
    РисунокШтрихкода.Объект.ТипКода = 4; // Например, EAN13
    РисунокШтрихкода.Объект.Сообщение = "4601234567890";
    РисунокШтрихкода.Объект.ОтображатьТекст = Истина;
    
  2. Использование 32-разрядного клиента. Если конфигурация сильно доработана и оперативный перенос кода печати затруднен, в качестве временного решения запустите систему через 32-разрядный клиент «1С:Предприятие». Однако помните, что это не решит проблему, если формирование печатных форм происходит в фоновых заданиях на 64-битном сервере приложений.

---

Методика 3. Борьба с интерфейсными багами и мерцанием форм

Переход на 8.3.16 принес пользователям обычных (неуправляемых) форм сильный визуальный дискомфорт: постоянное мерцание табличных частей при прокрутке, самопроизвольное сжатие («скукоживание») диалоговых окон и проблемы в работе встроенного Конструктора запросов.

Почему это происходит?
Эти графические артефакты связаны с доработкой в платформе механизма масштабирования под экраны с высоким разрешением (High-DPI) и изменением алгоритмов отрисовки окон Windows.

Проанализируем возможные методы устранения графических сбоев:

Таким образом, мы детально разобрали основные проблемы релизов 1С 8.3.16 и выработали пошаговые алгоритмы для их ликвидации. Своевременный переход на исправленные версии платформы и отказ от устаревших технологий ActiveX позволят вашим базам данных работать быстро и без сбоев.

← На главную