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