При работе с типовой конфигурацией 1С:Бухгалтерия предприятия 3.0 пользователи и разработчики часто сталкиваются с двумя распространенными задачами: разделением номенклатуры на товары и услуги в одном документе реализации, а также программным чтением строк табличной части через внешнее COM-соединение.
Разберем обе эти задачи по шагам, выясним причины типичных ошибок при работе через COM и рассмотрим правильные варианты реализации.
В документе РеализацияТоваровУслуг состав и видимость закладок на форме напрямую зависят от реквизита ВидОперации. По умолчанию при создании документа с видом операции «Товары (накладная)» или «Услуги (акт)» доступна только одна соответствующая табличная часть.
Чтобы в одном документе одновременно появились вкладки для товаров и услуг, выполним следующие действия:
Реализация (акт, накладная).После смены вида операции на форме документа станут доступны отдельные вкладки Товары, Услуги, Возвратная тара и Агентские услуги, что позволяет оформить комплексную отгрузку в рамках одного документа.
При попытке обойти табличную часть полученного по COM документа разработчики часто сталкиваются с тем, что вывод значений возвращает строку вида "COMОбъект" или вызывает ошибку Поле объекта не обнаружено (Наименование).
Проанализируем причину такого поведения. Локальная функция платформы Строка(COMОбъект) выполняется в контексте текущей информационной базы и не имеет прямого доступа к метаданным удаленного приложения. Для работы с данными удаленной базы необходимо либо запрашивать их строковые представления через методы COM-объекта, либо готовить выборку на стороне источника.
Если требуется получить строковое представление номенклатуры или значения перечисления (например, ставки НДС), обратимся к контекстным методам глобального контекста удаленной базы через объект соединения:
String() объекта соединения:
ИмяНоменклатуры = Соединение.String(РеалТов.Номенклатура);
XMLСтрока():
ИмяСтавкиНДС = Соединение.XMLСтрока(РеалТов.СтавкаНДС);
РеалТов.Номенклатура.Наименование важно убедиться, что ссылка в строке не является пустой, не содержит NULL или Неопределено, иначе платформой будет вызвано исключение.Построчное чтение табличной части через точку в COM-соединении порождает огромное количество межпроцессных вызовов (RPC), что значительно замедляет работу алгоритма. Наиболее эффективный подход — сформировать и выполнить Запрос целиком на стороне удаленной базы данных.
Посмотрим на пример правильной организации выборки:
ЗапросCOM = Соединение.NewObject("Запрос");
ЗапросCOM.Текст =
"ВЫБРАТЬ
| ТабЧасть.Номенклатура.Наименование КАК НаименованиеНоменклатуры,
| ПРЕДСТАВЛЕНИЕ(ТабЧасть.СтавкаНДС) КАК СтавкаНДСПредставление,
| ТабЧасть.Количество КАК Количество,
| ТабЧасть.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК ТабЧасть
|ГДЕ
| ТабЧасть.Ссылка = &СсылкаДокумента";
ЗапросCOM.УстановитьПараметр("СсылкаДокумента", ДокументСсылкаCOM);
Выборка = ЗапросCOM.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Номенклатура: " + Выборка.НаименованиеНоменклатуры);
Сообщить("Ставка НДС: " + Выборка.СтавкаНДСПредставление);
Сообщить("Количество: " + Выборка.Количество);
КонецЦикла;
При таком подходе все преобразования типов и получение наименований выполняются сервером удаленной базы, а в вызывающую базу передаются только готовые примитивные типы данных (числа, строки), что обеспечивает максимальное быстродействие и исключает ошибки преобразования типов.