При разработке механизмов интеграции 1С с внешними системами (например, при отправке данных на локальный сайт или в CRM) часто возникает задача извлечения текущих данных из формы документа. На примере документа Расходный кассовый ордер (РКО) мы разберем, как правильно обратиться к его реквизитам, как обработать сложные типы данных и подготовить информацию для передачи.
В современных конфигурациях 1С, использующих управляемые формы, данные документа не лежат в форме напрямую в виде переменных. Они содержатся в основном реквизите формы, который по умолчанию называется Объект. Рассмотрим ситуацию: вы создали команду (кнопку) на форме и хотите в ее обработчике получить данные. Проанализируем правильный синтаксис обращения:
Для доступа к основным полям РКО в модуле формы следует использовать префикс Объект. Это гарантирует, что вы обращаетесь именно к данным документа, а не к случайным элементам интерфейса. Разберем основные реквизиты:
Объект.СуммаДокумента — содержит числовое значение суммы операции.Объект.Контрагент — содержит ссылку на справочник (обычно «Контрагенты»).Объект.ДокументОснование — содержит ссылку на документ, послуживший причиной выплаты.Если вы пишете код непосредственно в модуле формы, система может позволить прямое обращение (как СуммаДокумента), но использование Объект.ИмяРеквизита является стандартом «чистого кода» и предотвращает ошибки при совпадении имен переменных.
Зачастую простого получения ссылки на контрагента недостаточно. Если ваша задача — передать на сайт фамилию, нужно учитывать структуру данных 1С. Рассмотрим ситуацию подробнее:
1. Контрагент — физическое лицо. В этом случае фамилия может храниться в поле Наименование или в специальных реквизитах физического лица. Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), фамилию можно извлечь программно. Проанализируем пример кода:
// Если контрагент является физическим лицом
Если ТипЗнч(Объект.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
// Получаем наименование для обработки
ПолноеИмя = Объект.Контрагент.Наименование;
// В простейшем случае фамилия — это первое слово до пробела
МассивСлов = СтрРазделить(ПолноеИмя, " ");
Фамилия = ?(МассивСлов.Количество() > 0, МассивСлов[0], "");
КонецЕсли;
2. Контрагент — юридическое лицо. У организаций нет фамилий. В этом случае обычно требуется передать либо название компании, либо ФИО доверенного лица, которое указано в поле «Выдать» (реквизит Выдать в РКО). Выясним, как это реализовать:
ДанныеДляСайта = "";
Если ЗначениеЗаполнено(Объект.Выдать) Тогда
// Используем данные из поля "Выдать" (строковый реквизит)
ДанныеДляСайта = Объект.Выдать;
Иначе
// Если поле пустое, берем наименование контрагента
ДанныеДляСайта = Строка(Объект.Контрагент);
КонецЕсли;
Реквизит ДокументОснование в РКО имеет составной тип. Это означает, что там может быть ссылка на «Поступление товаров», «Заявку на расход» или вовсе пустая ссылка. Для отправки на сайт ссылку необходимо преобразовать в строковое представление, понятное человеку.
Посмотрим на пример преобразования ссылки в текст:
ОписаниеОснования = "";
Если ЗначениеЗаполнено(Объект.ДокументОснование) Тогда
// Получаем стандартное представление: "Поступление (акты, накладные) №... от..."
ОписаниеОснования = Строка(Объект.ДокументОснование);
КонецЕсли;
Поскольку вы планируете отправлять данные на сайт, важно помнить о разделении контекста. Сбор данных из формы происходит на Клиенте, но формирование HTTP-запроса лучше выполнять на Сервере. Проанализируем пошагово процесс интеграции:
Объект.HTTPСоединение.Рассмотрим пример комплексной процедуры:
&НаКлиенте
Процедура ОтправитьНаСайт(Команда)
// Сбор данных с формы
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Sum", Объект.СуммаДокумента);
СтруктураДанных.Вставить("Counterparty", Строка(Объект.Контрагент));
СтруктураДанных.Вставить("Base", Строка(Объект.ДокументОснование));
// Вызов серверной части для отправки
ОтправитьДанныеНаСервере(СтруктураДанных);
КонецПроцедуры
&НаСервере
Процедура ОтправитьДанныеНаСервере(Данные)
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Здесь размещается код работы с HTTPСоединение
// Например: Соединение = Новый HTTPСоединение("mysite.local");
// ... дальнейшая отправка POST-запроса
КонецПроцедуры
Проанализируем несколько моментов, которые часто упускают «чайники» при разработке подобных кнопок:
Объект.Ссылка.Пустая()). Отправлять данные еще не сохраненного в базе документа — плохая практика.Объект.ВалютаДокумента в структуру отправки, иначе сайт не поймет, в чем измерена сумма.Попытка ... Исключение, чтобы при отсутствии интернета или падении сайта 1С не выдавала критическую ошибку пользователю.Используя данный подход, вы сможете корректно извлекать любые данные из формы РКО и передавать их во внешние системы, соблюдая стандарты разработки 1С.