При работе в экосистеме 1С часто возникает необходимость синхронизировать данные между различными конфигурациями. Одна из таких распространенных задач — это автоматическое обновление реквизитов объектов в одной системе на основании изменений в другой. В нашем случае мы рассмотрим, как настроить интеграцию между 1С:Документооборотом (1С:ДО) и 1С:Бухгалтерией (1С:БП) таким образом, чтобы при подписании договора в 1С:ДО соответствующий булевый реквизит "Договор подписан" в 1С:БП автоматически устанавливался в значение "Истина".
Пользователь столкнулся с проблемой, когда его код для правила заполнения реквизита на встроенном языке не обновлял флаг. Основной камень преткновения заключался в некорректном обращении к данным источника, а именно к статусу договора, передаваемому из 1С:Документооборота. Давайте разберем эту ситуацию по шагам и выясним, как правильно настроить логику.
Когда мы настраиваем правила заполнения реквизитов при интеграции, система 1С передает данные из источника (в нашем случае, из 1С:Документооборота) в переменную Параметры.Источник. Важно понимать, что Параметры.Источник — это не просто набор примитивных значений, а сложный объект, который может содержать вложенные структуры.
В нашем сценарии, реквизит statusApproval (статус согласования/утверждения) объекта Параметры.Источник является таким сложным объектом. Это не строка, которая напрямую содержит название статуса ("Подписан", "На согласовании" и т.д.), а объект, который, в свою очередь, имеет свои свойства. Для того чтобы получить строковое представление идентификатора статуса, нам необходимо обратиться к свойству objectID.id этого объекта statusApproval.
Итак, попытка сравнить Параметры.Источник.statusApproval = "Подписан" всегда будет приводить к ложному результату, потому что вы пытаетесь сравнить объект со строкой. Это фундаментальная ошибка, которую мы должны исправить.
ИнтеграцияС1СДокументооборотБазоваяФункциональность.СвойствоУстановленоПрежде чем обращаться к вложенным свойствам объекта, таким как statusApproval.objectID.id, крайне желательно убедиться, что само свойство statusApproval вообще существует и установлено. Это поможет избежать ошибок времени выполнения, если по какой-то причине объект из 1С:ДО пришел без этого свойства или оно не было заполнено.
Для этой цели в подсистеме интеграции с 1С:Документооборотом предусмотрена специальная функция: ИнтеграцияС1СДокументооборотБазоваяФункциональность.СвойствоУстановлено(). Она принимает два параметра: объект, в котором проверяется свойство, и имя проверяемого свойства в виде строки. Если свойство установлено, функция вернет Истина, в противном случае — Ложь.
Использование этой функции является лучшей практикой при работе с передаваемыми объектами, поскольку гарантирует более стабильную и безошибочную работу вашей интеграции. Давайте рассмотрим, как мы будем использовать ее в нашем коде.
После того как мы убедились, что свойство statusApproval установлено, мы можем безопасно обратиться к его содержимому для получения строкового идентификатора статуса. Как мы уже выяснили, правильный путь — это Параметры.Источник.statusApproval.objectID.id.
При этом важно помнить, что строковое значение, которое вы будете сравнивать, должно точно соответствовать внутреннему идентификатору статуса "Подписан" в вашей базе 1С:Документооборота. В большинстве случаев, если 1С:ДО настроена на русском языке, это будет строка "Подписан". Однако в некоторых ситуациях могут использоваться англоязычные аналоги (например, "Signed") или даже уникальные внутренние идентификаторы, особенно если статусы были кастомизированы. Мы еще вернемся к тому, как точно определить это значение с помощью отладки.
Таким образом, условие для проверки статуса будет выглядеть так: Если Параметры.Источник.statusApproval.objectID.id = "Подписан" Тогда.
Еще один важный аспект, на который обращали внимание коллеги на форуме, это правильное присвоение значения результирующему реквизиту. При написании произвольного алгоритма в правилах заполнения реквизита, система ожидает, что вы присвоите конечное значение переменной Параметры.Результат.
В нашем случае, реквизит "Договор подписан" в 1С:Бухгалтерии имеет тип "Булево". Это означает, что он может принимать одно из двух значений: Истина или Ложь. Чтобы установить этот флаг в положение "включен", мы должны присвоить Параметры.Результат = Истина;.
Если же статус договора в 1С:ДО не "Подписан", нам следует явно установить реквизит в Ложь, чтобы снять флаг. Это обеспечит корректную синхронизацию состояния флага при изменениях статуса договора в 1С:ДО.
Теперь, когда мы рассмотрели все необходимые компоненты, давайте объединим их в единый алгоритм, который вы сможете использовать в правилах заполнения реквизита в 1С:Бухгалтерии:
// Проверяем, установлено ли свойство statusApproval в объекте-источнике
УстановленСтатусСогласования = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СвойствоУстановлено(Параметры.Источник, "statusApproval");
// Если свойство statusApproval установлено, то анализируем его
Если УстановленСтатусСогласования Тогда
// Получаем строковый идентификатор статуса
ИдентификаторСтатуса = Параметры.Источник.statusApproval.objectID.id;
// Сравниваем полученный идентификатор с ожидаемым значением "Подписан"
Если ИдентификаторСтатуса = "Подписан" Тогда // Внимание: проверьте точное строковое значение статуса в вашей базе 1С:ДО (может быть "Signed" или другим)
Параметры.Результат = Истина; // Устанавливаем флаг "Договор подписан" в Истина
Иначе
Параметры.Результат = Ложь; // Если статус не "Подписан", сбрасываем флаг
КонецЕсли;
Иначе
// Если свойство statusApproval не установлено в источнике, считаем, что договор не подписан
Параметры.Результат = Ложь;
КонецЕсли;
Разберем этот код подробнее:
УстановленСтатусСогласования = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СвойствоУстановлено(Параметры.Источник, "statusApproval");СвойствоУстановлено, чтобы проверить, содержит ли объект Параметры.Источник свойство с именем "statusApproval". Результат проверки сохраняется в булевой переменной УстановленСтатусСогласования.Если УстановленСтатусСогласования Тогда ... КонецЕсли;statusApproval действительно существует в передаваемом объекте. Это критически важно для предотвращения ошибок типа "Поле объекта не обнаружено".ИдентификаторСтатуса = Параметры.Источник.statusApproval.objectID.id;objectID и id, чтобы получить строковый идентификатор текущего статуса договора из 1С:Документооборота. Мы сохраняем его в переменной ИдентификаторСтатуса для удобства.Если ИдентификаторСтатуса = "Подписан" Тогда ... КонецЕсли;Параметры.Результат = Истина;Истина.Иначе Параметры.Результат = Ложь; (внутри первого Если)Ложь. Это важно для поддержания актуальности данных, если статус договора изменится.Иначе Параметры.Результат = Ложь; (внешний)statusApproval вообще не было установлено в объекте-источнике (например, для новых или не до конца сформированных документов), мы также по умолчанию устанавливаем флаг "Договор подписан" в Ложь.Как уже упоминалось, критически важно убедиться в точном строковом значении статуса "Подписан" в вашей конкретной базе 1С:Документооборота. Если приведенный выше код не работает, несмотря на кажущуюся правильность, первое, что мы должны сделать, это провести отладку. Отладка позволит нам увидеть реальные значения, которые передаются в переменную Параметры.Источник.
Разберем по шагам, как это сделать:
УстановленСтатусСогласования = .... Для этого нужно щелкнуть левой кнопкой мыши по серой полосе слева от строки кода.Параметры.Источник. Раскроем ее структуру. Мы увидим свойство statusApproval. Раскроем и его. Внутри statusApproval найдем objectID, и уже внутри objectID мы увидим поле id. Значение поля id и будет тем точным строковым идентификатором статуса, которое необходимо использовать в вашем условии сравнения в коде.Этот метод является единственным надежным способом выяснить точное строковое представление статуса в вашей конкретной конфигурации 1С:Документооборота. Возможно, вместо "Подписан" там будет "Signed" или другой вариант. После того как вы узнаете точное значение, внесите его в ваш код.
Для успешной и стабильной работы интеграции между 1С:Документооборотом и 1С:Бухгалтерией рекомендуем учесть следующие моменты:
Следуя этим рекомендациям и правильно настроив код для обработки статусов, вы сможете успешно реализовать автоматическое обновление реквизита "Договор подписан" в 1С:Бухгалтерии на основании статуса договора в 1С:Документообороте, значительно упростив и автоматизировав бизнес-процессы.