При работе в конфигурациях 1С:Комплексная автоматизация 2 или 1С:ERP 2.5 пользователи часто сталкиваются с необходимостью вывода дополнительных данных на этикетки товаров. Одной из самых востребованных аналитик является Серия номенклатуры. Однако простая вставка поля в пользовательском редакторе шаблонов часто приводит к критической ошибке: Ошибка при вызове метода контекста (Выполнить): Поле не найдено "ИсходныеДанные.Серия". Разберем детально, почему это происходит и как исправить ситуацию программным путем.
В современных версиях 1С (начиная с 2.5.8 и выше) механизм печати этикеток и ценников значительно усложнился. Рассмотрим, как это работает «под капотом»:
Серия).ТаблицаЗначений), в которую собирает данные о товарах, ценах и остатках.ПечатьЭтикетокИЦенников2_5 происходит подмена текста запроса: вместо фиктивной таблицы ИсходныеДанныеПереопределяемый подставляется реальная таблица из памяти через параметр &Таблица.Серия, то запрос СКД, пытаясь обратиться к полю ИсходныеДанные.Серия, не находит его в переданном источнике. Это и вызывает исключение.Выясним причину, обратившись к коду обработки. В сообщении автора темы на форуме приведен фрагмент, который отвечает за подмену запроса. Рассмотрим этот участок подробнее:
// Подмена запроса при печати этикеток...
Если ИсходныеДанные <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ИсходныеДанныеПереопределяемый", "&Таблица");
ОбщегоНазначенияУТ.ПронумероватьТаблицуЗначений(ИсходныеДанные, "Порядок");
Запрос.Параметры.Вставить("Таблица", ИсходныеДанные);
// ... далее идет замена строковых представлений полей ...
КонецЕсли;
Проблема заключается в переменной ИсходныеДанные. Это таблица значений, которая передается в процедуру печати. Если в конфигурации не включен учет серий или если алгоритм заполнения таблицы (функция ПодготовитьСтруктуруДанных) посчитал, что серии не нужны для данного типа печати, колонка просто не будет создана. Даже если в макете СКД ПоляШаблонаТовары поле описано, физически в переданной ТЗ его нет.
Прежде чем приступать к программированию, проанализируем настройки системы. В 1С:КА 2.5 использование серий сильно зависит от Политики учета серий, заданной в виде номенклатуры. Рассмотрим чек-лист:
Использовать серии номенклатуры в настройках склада и номенклатуры.Если настройки верны, но ошибка сохраняется, необходимо выполнить доработку. Мы не рекомендуем менять типовую конфигурацию — лучше использовать механизм Расширений. Нам нужно перехватить формирование таблицы ИсходныеДанные и убедиться, что колонка Серия там присутствует.
Посмотрим на пример кода, который можно внедрить в расширение для обработки ПечатьЭтикетокИЦенников2_5. Нам нужно внести изменения в процедуру, где формируется структура данных перед вызовом запроса:
&После("ПодготовитьСтруктуруДанных")
Процедура Ипр_ПодготовитьСтруктуруДанных(СтруктураНастроек, ИмяТаблицыТоваров, СтруктураРезультата)
// Получаем таблицу, которая была подготовлена типовым кодом
ТаблицаТоваров = СтруктураРезультата.Таблица;
// Проверяем наличие колонки "Серия".
// Если ее нет, добавляем её, чтобы запрос не выдавал ошибку.
Если ТаблицаТоваров.Колонки.Найти("Серия") = Неопределено Тогда
ТаблицаТоваров.Колонки.Add("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
КонецЕсли;
// Если данные о сериях есть в исходных объектах,
// здесь можно реализовать их заполнение в таблицу.
КонецПроцедуры
Этот метод гарантирует, что даже если таблица пустая или серии не заполнены, запрос «увидит» колонку и успешно выполнится, выведя в поле этикетки пустое значение вместо падения системы.
Рассмотрим ситуацию, когда поле Серия отсутствует в самом макете, который используется для генерации списка доступных полей. В обработке печати есть несколько макетов:
ПоляШаблонаТовары — используется для выбора полей в редакторе.ПоляШаблонаПечатьТовары — используется непосредственно при генерации данных.Проанализируем текст запроса в этих макетах. Если вы добавили поле в один макет, но забыли про другой, возникнет конфликт. В тексте запроса (как видно из сообщения 4) обязательно должно быть описание поля во временной таблице:
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка) КАК Серия, // Поле должно быть здесь!
0 КАК Порядок
ПОМЕСТИТЬ ИсходныеДанные
Если вы редактируете макеты, убедитесь, что тип данных для поля Серия указан верно — СправочникСсылка.СерииНоменклатуры.
Подводя итог, можно сказать, что ошибка «Поле не найдено» в 1С 2.5 — это следствие жесткой связи между динамически формируемым текстом запроса и программно создаваемым объектом ТаблицаЗначений. Для исправления ситуации выполните следующие действия:
ИсходныеДанные непосредственно перед методом Запрос.Выполнить().Использование расширения для принудительного добавления колонки Серия в таблицу ИсходныеДанные является самым стабильным решением, которое позволит избежать ошибок при обновлении конфигурации.