При разработке отчетов или кастомных механизмов в конфигурации 1С:Управление торговлей 11.4 (а также в ERP 2 и КА 2) программисты часто сталкиваются с неочевидным поведением табличных частей. Типичная ситуация: вы открываете документ, например, Отчет комиссионера (агентов) о продажах, переходите в форму Виды запасов и видите там идеальный порядок. Но стоит написать запрос к этой табличной части, как выясняется, что поле НомерСтроки живет своей жизнью и совершенно не соответствует позиции товара в основной таблице документа. Давайте разберем этот механизм детально и выясним, как с этим работать без ущерба для логики системы.
Рассмотрим ситуацию, которую описывают разработчики. В документе есть две ключевые таблицы: Товары (где пользователь указывает, что он продает) и ВидыЗапасов (где система хранит информацию, ЧТО ИМЕННО было списано — чей товар, с какой ГТД и по какому виду собственности). Для пользователя в интерфейсе эти таблицы выглядят синхронизированными. Однако технически это не так.
Выясним причину: поле НомерСтроки в 1С — это системный реквизит, который просто отражает физический индекс записи в конкретной таблице. Поскольку ТЧ ВидыЗапасов заполняется автоматически программными механизмами проведения, ее состав может кардинально отличаться от состава ТЧ Товары. Например, одна строка товара может породить три строки видов запасов, если товар списывается из разных партий или от разных комитентов. В этом случае порядковые номера в принципе не могут совпадать.
Проанализируем пример запроса, который может выдать "странные" результаты:
ВЫБРАТЬ
ОтчетКомиссионераВидыЗапасов.НомерСтроки КАК НомерСтроки,
ОтчетКомиссионераВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура.Артикул КАК Артикул,
ОтчетКомиссионераВидыЗапасов.АналитикаУчетаНоменклатуры.Номенклатура.Наименование КАК Наименование,
ОтчетКомиссионераВидыЗапасов.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры
ИЗ
Документ.ОтчетКомиссионера.ВидыЗапасов КАК ОтчетКомиссионераВидыЗапасов
ГДЕ
ОтчетКомиссионераВидыЗапасов.Ссылка = &Ссылка
В данном случае НомерСтроки будет соответствовать порядку записей в таблице БД, который зачастую совпадает с порядком записей в регистре накопления Товары принятые на комиссию. Это происходит потому, что при проведении система берет готовую таблицу видов запасов и "пачкой" записывает ее в движения регистров. Но для связи с визуальной строкой в документе этот номер бесполезен.
Чтобы понять, как работать с этими данными, разберем роль ТЧ ВидыЗапасов как буфера. В современных конфигурациях 1С (УТ 11, ERP 2) реализован механизм разделения товарного и финансового учета. Когда пользователь нажимает "Провести", система выполняет сложный расчет и записывает его результат в скрытую (или полускрытую) таблицу Виды запасов.
Ключевые особенности этого механизма:
Себестоимость товаров, Товары организаций, Выручка и себестоимость продаж) строятся на основании данных именно из этой таблицы, а не из ТЧ Товары.Видах запасов "засыпают". Это гарантирует, что при расчете себестоимости в конце месяца система будет использовать именно ту аналитику, которая была зафиксирована в момент продажи, даже если позже приходы были изменены задним числом.Как же нам соединить товар из основной части документа с его расшифровкой в видах запасов? Для этого в 1С предусмотрен специальный реквизит КлючСвязи.
Рассмотрим по шагам, как это работает:
Товары есть скрытый числовой реквизит КлючСвязи.ВидыЗапасов также есть реквизит КлючСвязи.Посмотрим на пример правильного запроса, который корректно сопоставит данные:
ВЫБРАТЬ
ТЧТовары.НомерСтроки КАК НомерСтрокиПользователя,
ТЧТовары.Номенклатура КАК Номенклатура,
ТЧВидыЗапасов.ВидЗапасов КАК ВидЗапасов,
ТЧВидыЗапасов.Количество КАК КоличествоРасшифровка
ИЗ
Документ.ОтчетКомиссионера.Товары КАК ТЧТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОтчетКомиссионера.ВидыЗапасов КАК ТЧВидыЗапасов
ПО ТЧТовары.Ссылка = ТЧВидыЗапасов.Ссылка
И ТЧТовары.КлючСвязи = ТЧВидыЗапасов.КлючСвязи
ГДЕ
ТЧТовары.Ссылка = &Ссылка
Именно такой подход позволит вам вывести пользователю привычный ему НомерСтроки из основной таблицы, при этом показав детальную информацию из видов запасов.
Многих смущает, что при нажатии кнопки "Открыть виды запасов" в документе открывается форма, где всё красиво и понятно. Важно понимать: эта форма (ФормаВводаВидовЗапасов) не является прямым отображением таблицы БД.
Проанализируем ситуацию: при открытии формы срабатывает процедура ЗаполнитьДеревоВидовЗапасов. Она выполняет динамический запрос, который группирует данные, соединяет их по КлючуСвязи и представляет в виде иерархии или последовательного списка. 1С тратит значительные вычислительные ресурсы, чтобы "причесать" данные для человека. В самой же базе данных (в таблицах SQL) эти записи хранятся так, как удобно серверу для быстрой записи движений.
При работе с документами в УТ 11.4 придерживайтесь следующих правил, чтобы не попасть в ловушку "странного поведения" таблиц:
КлючСвязи.Товары, но не перепровел документ, ТЧ ВидыЗапасов может содержать устаревшие данные. Для получения актуальной картины иногда требуется вызывать программное заполнение видов запасов перед анализом.Регистратор + КлючСвязи. В большинстве финансовых регистров УТ 11 это поле присутствует и позволяет однозначно идентифицировать, какая строка документа сделала конкретное движение.ПроведениеСервер. Там можно найти, как система формирует временные таблицы для движений.Подводя итог, можно сказать, что поведение таблиц в УТ 11.4 — это не "баг" и не "бизнес ради бизнеса", а следствие сложной архитектуры, рассчитанной на высокую производительность и точность финансового учета. Понимание механизма Ключа связи снимает все вопросы к "странным" номерам строк.