Как обновить реквизит "Договор подписан" в 1С:Бухгалтерии при изменении статуса договора в 1С:Документообороте?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе в экосистеме 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. Первая строка: УстановленСтатусСогласования = ИнтеграцияС1СДокументооборотБазоваяФункциональность.СвойствоУстановлено(Параметры.Источник, "statusApproval");
    Мы вызываем функцию СвойствоУстановлено, чтобы проверить, содержит ли объект Параметры.Источник свойство с именем "statusApproval". Результат проверки сохраняется в булевой переменной УстановленСтатусСогласования.
  2. Блок Если УстановленСтатусСогласования Тогда ... КонецЕсли;
    Этот блок выполняется только в том случае, если свойство statusApproval действительно существует в передаваемом объекте. Это критически важно для предотвращения ошибок типа "Поле объекта не обнаружено".
  3. Строка ИдентификаторСтатуса = Параметры.Источник.statusApproval.objectID.id;
    Если свойство установлено, мы безопасно обращаемся к вложенным свойствам objectID и id, чтобы получить строковый идентификатор текущего статуса договора из 1С:Документооборота. Мы сохраняем его в переменной ИдентификаторСтатуса для удобства.
  4. Блок Если ИдентификаторСтатуса = "Подписан" Тогда ... КонецЕсли;
    Здесь мы сравниваем полученный строковый идентификатор с ожидаемым значением "Подписан". Если они совпадают, это означает, что договор в 1С:ДО имеет статус "Подписан".
  5. Строка Параметры.Результат = Истина;
    Если статус "Подписан", мы устанавливаем значение булевого реквизита "Договор подписан" в 1С:БП на Истина.
  6. Блок Иначе Параметры.Результат = Ложь; (внутри первого Если)
    Если статус договора в 1С:ДО не "Подписан" (например, "На согласовании", "Черновик", "Отклонен"), мы явно сбрасываем флаг "Договор подписан" в Ложь. Это важно для поддержания актуальности данных, если статус договора изменится.
  7. Блок Иначе Параметры.Результат = Ложь; (внешний)
    Если свойство statusApproval вообще не было установлено в объекте-источнике (например, для новых или не до конца сформированных документов), мы также по умолчанию устанавливаем флаг "Договор подписан" в Ложь.

Отладка и диагностика: как проверить значение статуса в 1С:Документообороте

Как уже упоминалось, критически важно убедиться в точном строковом значении статуса "Подписан" в вашей конкретной базе 1С:Документооборота. Если приведенный выше код не работает, несмотря на кажущуюся правильность, первое, что мы должны сделать, это провести отладку. Отладка позволит нам увидеть реальные значения, которые передаются в переменную Параметры.Источник.

Разберем по шагам, как это сделать:

  1. Откроем конфигуратор 1С:Бухгалтерии. Это та база, где настроено правило заполнения реквизита.
  2. Перейдем к справочнику "Правила интеграции" (или тому месту, где вы редактировали алгоритм). Откроем ваше правило.
  3. В поле "Произвольный алгоритм" установим точку останова (breakpoint) на первой строке кода, например, на УстановленСтатусСогласования = .... Для этого нужно щелкнуть левой кнопкой мыши по серой полосе слева от строки кода.
  4. Запустим сеанс отладки. Это можно сделать, запустив предприятие в режиме отладки из конфигуратора (меню "Отладка" -> "Начать отладку") или присоединившись к уже запущенному процессу 1С:Предприятия.
  5. Инициируем процесс, который должен вызвать выполнение вашего правила. Это может быть либо выполнение регламентного задания обмена данными, либо ручное обновление объекта "Договор" в 1С:Бухгалтерии, которое вызовет синхронизацию из 1С:Документооборота.
  6. Когда выполнение кода достигнет вашей точки останова, отладчик прервет работу. В окне отладчика (например, "Табло" или "Выражения") мы можем просмотреть значения переменных.
  7. В отладчике найдем переменную Параметры.Источник. Раскроем ее структуру. Мы увидим свойство statusApproval. Раскроем и его. Внутри statusApproval найдем objectID, и уже внутри objectID мы увидим поле id. Значение поля id и будет тем точным строковым идентификатором статуса, которое необходимо использовать в вашем условии сравнения в коде.

Этот метод является единственным надежным способом выяснить точное строковое представление статуса в вашей конкретной конфигурации 1С:Документооборота. Возможно, вместо "Подписан" там будет "Signed" или другой вариант. После того как вы узнаете точное значение, внесите его в ваш код.

Дополнительные рекомендации по интеграции

Для успешной и стабильной работы интеграции между 1С:Документооборотом и 1С:Бухгалтерией рекомендуем учесть следующие моменты:

  1. Публикация на веб-сервере: Убедитесь, что обе базы 1С:Документооборот и 1С:Бухгалтерия корректно опубликованы на веб-сервере. Это обязательное условие для функционирования механизмов бесшовной интеграции и обмена данными.
  2. Актуальность подсистемы интеграции: Регулярно обновляйте конфигурации 1С:ДО и 1С:БП до последних релизов. Вместе с обновлениями часто поставляются и актуализации подсистем обмена, что может решать возникающие проблемы и добавлять новую функциональность.
  3. Регламентные задания: Настройте регламентные задания для автоматической синхронизации данных. Это позволит поддерживать актуальность информации без ручного вмешательства. Убедитесь, что расписание заданий соответствует потребностям бизнеса.
  4. Тестирование: Всегда проводите тщательное тестирование всех изменений на тестовой базе перед их переносом в рабочую среду. Это поможет выявить и устранить потенциальные ошибки без ущерба для рабочего процесса.
  5. Логирование обмена: Включите подробное логирование обмена данными, если есть такая возможность. Журналы обмена могут дать ценную информацию о причинах возникновения ошибок и помочь в их диагностике.

Следуя этим рекомендациям и правильно настроив код для обработки статусов, вы сможете успешно реализовать автоматическое обновление реквизита "Договор подписан" в 1С:Бухгалтерии на основании статуса договора в 1С:Документообороте, значительно упростив и автоматизировав бизнес-процессы.

← На главную