Как исправить ошибку «Поле не найдено "ИсходныеДанные.Серия"» при печати этикеток в 1С:КА 2.5 и ERP 2.5

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

При работе в конфигурациях 1С:Комплексная автоматизация 2 или 1С:ERP 2.5 пользователи часто сталкиваются с необходимостью вывода дополнительных данных на этикетки товаров. Одной из самых востребованных аналитик является Серия номенклатуры. Однако простая вставка поля в пользовательском редакторе шаблонов часто приводит к критической ошибке: Ошибка при вызове метода контекста (Выполнить): Поле не найдено "ИсходныеДанные.Серия". Разберем детально, почему это происходит и как исправить ситуацию программным путем.

Причина возникновения ошибки: теория и механизм печати

В современных версиях 1С (начиная с 2.5.8 и выше) механизм печати этикеток и ценников значительно усложнился. Рассмотрим, как это работает «под капотом»:

  1. Система анализирует выбранный пользователем шаблон этикетки и определяет список необходимых полей (в нашем случае добавлена Серия).
  2. Программа формирует временную таблицу в оперативной памяти (объект ТаблицаЗначений), в которую собирает данные о товарах, ценах и остатках.
  3. В модуле менеджера обработки ПечатьЭтикетокИЦенников2_5 происходит подмена текста запроса: вместо фиктивной таблицы ИсходныеДанныеПереопределяемый подставляется реальная таблица из памяти через параметр &Таблица.
  4. Главная проблема: Если в программном коде, формирующем эту таблицу значений, не прописано явное добавление колонки Серия, то запрос СКД, пытаясь обратиться к полю ИсходныеДанные.Серия, не находит его в переданном источнике. Это и вызывает исключение.

Анализ программного кода в модуле менеджера

Выясним причину, обратившись к коду обработки. В сообщении автора темы на форуме приведен фрагмент, который отвечает за подмену запроса. Рассмотрим этот участок подробнее:


// Подмена запроса при печати этикеток...
Если ИсходныеДанные <> Неопределено Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИсходныеДанныеПереопределяемый", "&Таблица");
    ОбщегоНазначенияУТ.ПронумероватьТаблицуЗначений(ИсходныеДанные, "Порядок");
    Запрос.Параметры.Вставить("Таблица", ИсходныеДанные);
    // ... далее идет замена строковых представлений полей ...
КонецЕсли;

Проблема заключается в переменной ИсходныеДанные. Это таблица значений, которая передается в процедуру печати. Если в конфигурации не включен учет серий или если алгоритм заполнения таблицы (функция ПодготовитьСтруктуруДанных) посчитал, что серии не нужны для данного типа печати, колонка просто не будет создана. Даже если в макете СКД ПоляШаблонаТовары поле описано, физически в переданной ТЗ его нет.

Решение 1: Проверка функциональных опций и политик учета

Прежде чем приступать к программированию, проанализируем настройки системы. В 1С:КА 2.5 использование серий сильно зависит от Политики учета серий, заданной в виде номенклатуры. Рассмотрим чек-лист:

Решение 2: Программное добавление колонки через Расширение

Если настройки верны, но ошибка сохраняется, необходимо выполнить доработку. Мы не рекомендуем менять типовую конфигурацию — лучше использовать механизм Расширений. Нам нужно перехватить формирование таблицы ИсходныеДанные и убедиться, что колонка Серия там присутствует.

Посмотрим на пример кода, который можно внедрить в расширение для обработки ПечатьЭтикетокИЦенников2_5. Нам нужно внести изменения в процедуру, где формируется структура данных перед вызовом запроса:


&После("ПодготовитьСтруктуруДанных")
Процедура Ипр_ПодготовитьСтруктуруДанных(СтруктураНастроек, ИмяТаблицыТоваров, СтруктураРезультата)
    
    // Получаем таблицу, которая была подготовлена типовым кодом
    ТаблицаТоваров = СтруктураРезультата.Таблица;
    
    // Проверяем наличие колонки "Серия". 
    // Если ее нет, добавляем её, чтобы запрос не выдавал ошибку.
    Если ТаблицаТоваров.Колонки.Найти("Серия") = Неопределено Тогда
        ТаблицаТоваров.Колонки.Add("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
    КонецЕсли;
    
    // Если данные о сериях есть в исходных объектах, 
    // здесь можно реализовать их заполнение в таблицу.
    
КонецПроцедуры

Этот метод гарантирует, что даже если таблица пустая или серии не заполнены, запрос «увидит» колонку и успешно выполнится, выведя в поле этикетки пустое значение вместо падения системы.

Решение 3: Исправление макетов СКД

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

  1. ПоляШаблонаТовары — используется для выбора полей в редакторе.
  2. ПоляШаблонаПечатьТовары — используется непосредственно при генерации данных.

Проанализируем текст запроса в этих макетах. Если вы добавили поле в один макет, но забыли про другой, возникнет конфликт. В тексте запроса (как видно из сообщения 4) обязательно должно быть описание поля во временной таблице:


ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
    ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
    ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка) КАК Серия, // Поле должно быть здесь!
    0 КАК Порядок
ПОМЕСТИТЬ ИсходныеДанные

Если вы редактируете макеты, убедитесь, что тип данных для поля Серия указан верно — СправочникСсылка.СерииНоменклатуры.

Итоги и рекомендации

Подводя итог, можно сказать, что ошибка «Поле не найдено» в 1С 2.5 — это следствие жесткой связи между динамически формируемым текстом запроса и программно создаваемым объектом ТаблицаЗначений. Для исправления ситуации выполните следующие действия:

Использование расширения для принудительного добавления колонки Серия в таблицу ИсходныеДанные является самым стабильным решением, которое позволит избежать ошибок при обновлении конфигурации.

← На главную