Claude Skill

1c-ssl-patterns

SSL/БСП subsystems guidance and search via 1c-mcp_ssl_server MCP. Use when working with standard library subsystems - users, files, print forms, background jobs, email, common utilities.

LLM Mart · 0 points · 14 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download Desko77-claude-code-skills-1c-skills_1c-ssl-patterns-ac33656.zip · 95 KB
Part of desko77/claude-code-skills-1c — 48 skills

Install

skills CLI npx skills add https://github.com/Desko77/claude-code-skills-1c/tree/main/skills/1c-ssl-patterns
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install desko77-claude-code-skills-1c@llmmart
Git git clone https://github.com/Desko77/claude-code-skills-1c.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole desko77/claude-code-skills-1c collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Прикладные сценарии БСП

Справочник отвечает на вопрос КАК ПРИМЕНЯТЬ механизм библиотеки. На вопросы существует ли вызов, какая у него сигнатура и в каком контексте он доступен отвечает другой скил - 1c-bsp-api.

Разделение точек входа:

Вопрос Скил
как сделать X через БСП, каким механизмом, в каком порядке этот
какая сигнатура, существует ли вызов, серверный он или клиентский 1c-bsp-api
как зарегистрировать свою обработку или команду в библиотеке 1c-bsp-command, 1c-bsp-registration

Разведение по триггерам не означает взаимного исключения: прикладной сценарий ДОЛЖЕН проверять вызовы через 1c-bsp-api, и это часть работы, а не переход к другому скилу.

Порядок работы

  1. Определи МЕХАНИЗМ задачи и возьми справочник по таблице ниже. Грузится один справочник НА МЕХАНИЗМ: задача из трех механизмов законно требует трех. Справочник "на всякий случай" не грузится.

  2. Внутри справочника найди сценарий по заголовку ### и прочитай его диапазоном. Файл целиком не загружается.

  3. Проверь каждый вызов перед тем, как его написать. Имена в БСП длинные и составные, поэтому выдумка выглядит как настоящее имя:

    python skills/1c-bsp-api/scripts/bsp-api.py check РегламентныеЗаданияСервер.НайтиЗадания
    

    Проверка сообщает и об устаревании, а не только о существовании. Код возврата 1, если вызова нет.

  4. Сценария нет в справочниках - искать по теме через ssl_search сервера 1c-mcp_ssl_server, затем подтверждать найденное проверкой из пункта 3. MCP судит по документации и называет методы, которых в этой версии нет.

При расхождении источников прав тот, что ближе к поставке: исходник модуля старше справочника 1c-bsp-api, справочник старше MCP.

Справочники по механизмам

Механизм и ключевые слова Файл
реквизит объекта без чтения объекта, сообщение пользователю, коллекции, безопасный режим, режим работы базы references/base-functionality.md
задание по расписанию, планировщик, включить и выключить задание, расписание references/scheduled-jobs.md
текущий пользователь, полнота прав, внешний пользователь, учетная запись базы references/users.md
право на запись, роль, профиль группы доступа, наборы значений доступа, пересчет прав references/access-management.md
печать, печатная форма, команда печати, макет, менеджер печати references/printing.md
присоединенный файл, вложение, том хранения, сканирование, открыть файл references/attached-files.md
обработчик обновления, переход на новую версию, отложенное обновление, версия ИБ references/infobase-update.md
установка обновления, поиск обновлений, резервная копия перед обновлением references/configuration-update.md
вариант отчета, размещение отчета в разделах, команда отчета на форме references/report-variants.md
внешняя обработка, дополнительный отчет, внешняя печатная форма, подключить обработку references/external-reports-processors.md
команда на форме от другой подсистемы, размещение команд, обновление команд после записи references/attachable-commands.md
дополнительный реквизит, дополнительное сведение, набор свойств, метки references/additional-properties.md
запрет правки поля после проведения, разблокировка реквизитов на форме references/attribute-locking.md
закрытый период, дата запрета изменения, запрет загрузки данных references/period-end-closing.md
история изменений объекта, версия объекта, откат к прежней версии references/object-versioning.md
префикс номера, префикс базы, префикс организации, номер на печать references/object-prefixes.md
синхронизация баз, узел обмена, регистрация изменений, универсальный формат references/data-exchange.md
адрес, телефон, почта объекта, вид контактной информации references/contact-information.md
отправить письмо, загрузить входящие, учетная запись почты, небезопасный HTML references/email.md
дубли элементов, замена на оригинал, удаление помеченных, ссылочная целостность references/duplicates-and-deletion.md
подписать объект, сертификат, штамп подписи в печатной форме references/digital-signature.md
доверенность ФНС, облачная подпись DSS, мобильная подпись references/signature-services.md
задача, бизнес-процесс, адресация по роли, отложенный старт references/business-processes.md
данные на нескольких языках, подстановка языка в запрос references/multilanguage.md
шаблон письма, подстановка данных объекта, получатели по шаблону references/message-templates.md
персональные данные, согласие субъекта, срок уничтожения references/personal-data.md
курс валюты, сумма прописью, банк по БИК, рабочие даты по графику и календарю references/currencies-banks-calendars.md
регион по коду, коды адреса, адресный реестр references/address-classifier.md
загрузка из файла в справочник, групповое изменение, выгрузка в файлы, структура подчиненности references/bulk-data-operations.md
напоминание, заметка, текущие дела, письма и звонки контакту references/user-workplace.md
загрузка по сети и прокси, SMS, штрихкод, внешняя компонента references/integration-basics.md
проверка корректности данных, регистр проблем, рассылка отчетов по расписанию references/accounting-checks-and-reports.md
состояние бумажного оригинала, склонение по падежам, конструктор формул references/document-workflow-extras.md
публикация OData, сообщение при запуске, отчет о движениях, ручной порядок в списке references/extension-points.md
сведения об организации, ответственные лица, форма настроек программы references/organizations-and-settings.md
завершение сеансов, безопасный режим и разрешения, журнал действий, резервная копия references/administration.md
замер ключевой операции, статистика использования, полнотекстовый поиск, итоги references/monitoring-and-search.md
модель сервиса и разделение данных, обсуждения, анкетирование references/service-model-and-collaboration.md

Реестр тем закрыт целиком: 70 тем главы 3 документации в 38 справочниках. Механизмы, у которых прикладного интерфейса нет, названы явно вместе с причиной - это тоже знание, и оно удерживает от поиска несуществующих модулей.

Если справочника еще нет

ssl_search сервера 1c-mcp_ssl_server - векторный поиск по документации БСП. Запрос формулируется описанием задачи на русском: ssl_search("фоновое задание прогресс"). У сервера РОВНО ОДИН инструмент; имен вида get_function_info или search_modules на нем нет.

Существование найденного подтверждается bsp-api.py check, а не самим поиском.

Происхождение

Сценарии написаны нами по документации ИТС и исходникам библиотеки. Имена, сигнатуры, состав параметров и номера версий - факты и взяты как есть; сигнатуры и регионы берутся из поставки библиотеки, потому что документация с ней местами расходится. Примеры BSL свои и проверены check.

Files (claude-code-skills-1c)
  • evals
    • evals.json 4.7 KB
      {
        "skill_name": "1c-ssl-patterns",
        "evals": [
          {
            "id": "background-op-with-progress",
            "prompt": "Мне нужно запустить долгую операцию пересчета себестоимости в фоне с отображением прогресса пользователю. Как это сделать через БСП?",
            "expected_output": "Использован актуальный API длительных операций: ВыполнитьФункцию либо ВыполнитьПроцедуру с ожиданием на клиенте. Устаревший ВыполнитьВФоне не предлагается.",
            "expectations": [
              "Использован ДлительныеОперации.ВыполнитьФункцию или ВыполнитьПроцедуру",
              "Показан вызов ДлительныеОперацииКлиент.ОжидатьЗавершение",
              "Прогресс передается через ДлительныеОперации.СообщитьПрогресс",
              "Пример включает клиентскую часть и серверную",
              "Устаревший ВыполнитьВФоне не предложен как основной способ"
            ],
            "expect": [
              "ДлительныеОперации\\s*\\.\\s*Выполнить(Функцию|Процедуру)",
              "ОжидатьЗавершение"
            ],
            "forbid": [
              "ФоновыеЗадания\\s*\\.\\s*Выполнить\\s*\\(",
              "ДлительныеОперации\\s*\\.\\s*ВыполнитьВФоне\\s*\\("
            ],
            "checks_bsl": true
          },
          {
            "id": "send-email",
            "prompt": "Нужно отправить письмо пользователю по email после завершения обработки заказа. Какие функции БСП использовать? Покажи пример кода.",
            "expected_output": "Пример использования подсистемы РаботаСПочтовымиСообщениями БСП: создание и отправка письма через стандартные методы библиотеки.",
            "expectations": [
              "Упомянут модуль РаботаСПочтовымиСообщениями как основной для отправки почты через БСП",
              "Показан пример с созданием объекта ИнтернетПочтовоеСообщение или использованием готового метода БСП",
              "Рекомендован поиск через ssl_search перед написанием кастомного кода",
              "Пример содержит указание на необходимость настройки учетной записи электронной почты"
            ],
            "expect": [
              "РаботаСПочтовымиСообщениями"
            ],
            "checks_bsl": true
          },
          {
            "id": "check-user-role",
            "prompt": "Как через БСП получить список ролей текущего пользователя и проверить, есть ли у него конкретная роль?",
            "expected_output": "Пример использования подсистемы Пользователи или ОбщегоНазначения: получение ролей пользователя, проверка наличия роли через РольДоступна().",
            "expectations": [
              "Показан вызов функции РольДоступна() из платформы или аналогичного метода БСП",
              "Упомянут модуль Пользователи БСП как источник API для работы с пользователями и правами",
              "Рекомендовано использовать ssl_search для поиска актуального API в версии БСП проекта",
              "Показан пример проверки прав перед выполнением привилегированной операции"
            ],
            "expect": [
              "Пользователи\\s*\\.\\s*(РолиДоступны|ЭтоПолноправныйПользователь)"
            ],
            "checks_bsl": true
          }
        ],
        "_": "Гоняются через tools/run_skill_evals.py. Поля expect и forbid - регулярные выражения по тексту ответа, checks_bsl включает сверку вызовов BSL со справочником БСП."
      }
      
  • references
    • access-management.md 11.1 KB
      # Управление доступом
      
      Механизм БСП, ограничивающий доступ на уровне записей и полей: профили групп
      доступа, виды доступа, наборы значений доступа. Отвечает на вопрос "какие данные
      видит этот пользователь", тогда как роли платформы отвечают на вопрос "какие
      действия ему вообще разрешены".
      
      Не путать с механизмом `Пользователи`: там учетные записи и текущий пользователь,
      здесь права на данные.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `УправлениеДоступом` | программный интерфейс | сервер, толстый клиент, внешнее соединение |
      | `УправлениеДоступомПереопределяемый` | точка расширения: свои виды доступа и наборы значений | сервер, толстый клиент, внешнее соединение |
      | `УправлениеДоступомСлужебный` и еще шесть с тем же началом | внутренняя реализация библиотеки | - |
      
      **Публичного клиентского модуля у механизма нет.** `УправлениеДоступомСлужебныйКлиент`
      и `УправлениеДоступомСлужебныйКлиентСервер` служебные, как и говорит их имя.
      Проверку прав выполняет сервер, и клиент получает уже результат.
      
      ## Сценарии
      
      ### 1. Проверить право пользователя на конкретный объект
      
      **Задача:** до выполнения действия убедиться, что у пользователя есть право на
      ЭТУ запись, а не вообще на вид объекта.
      
      **Функции:**
      
      `УправлениеДоступом.ЕстьПраво(Право, СсылкаНаОбъект, Знач Пользователь = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеДоступом.ИзменениеРазрешено(ОписаниеДанных, Пользователь = Неопределено) Экспорт`
      - функция, тот же регион.
      
      **Параметры:**
      
      - `Право` - `Строка`: чтение, изменение и прочие.
      - `СсылкаНаОбъект` - ссылка на конкретную запись.
      - `Пользователь` - `Неопределено` означает текущего.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция МожноПравитьДокумент(Знач Ссылка)
      
          Возврат УправлениеДоступом.ЕстьПраво("Изменение", Ссылка);
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не подменять эту проверку платформенной `ПравоДоступа`: та отвечает на вопрос о
        виде объекта целиком и про ограничение на уровне записей ничего не знает.
      - Не считать отсутствие права ошибкой программы: это штатный ответ, и пользователю
        показывается сообщение, а не исключение.
      
      ### 2. Проверить роль пользователя
      
      **Задача:** ветвление логики по роли, а не по конкретному праву.
      
      **Функции:**
      
      `УправлениеДоступом.ЕстьРоль(Знач Роль, Знач СсылкаНаОбъект = Неопределено, Знач Пользователь = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция ЭтоКладовщик()
      
          Возврат УправлениеДоступом.ЕстьРоль("ДобавлениеИзменениеСкладскихДокументов");
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Ветвление по роли - крайняя мера. Право на данные проверяется правом, а не
        ролью: роль может называться иначе во внедрении, а право останется прежним.
      - Полноту прав проверяют не ролью, а `Пользователи.ЭтоПолноправныйПользователь`.
      
      ### 3. Назначить пользователю профиль группы доступа
      
      **Задача:** при создании пользователя из кода выдать ему набор прав.
      
      **Функции:**
      
      `УправлениеДоступом.ВключитьПрофильПользователю(Пользователь, Профиль) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеДоступом.ВыключитьПрофильПользователю(Пользователь, Профиль = Неопределено) Экспорт`
      - процедура, тот же регион. Без профиля выключает все.
      
      `УправлениеДоступом.ГруппаДоступаАдминистраторы() Экспорт` - функция, тот же
      регион.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ВыдатьПрофильСкладовщика(Знач Пользователь)
      
          Профиль = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Кладовщик");
          Если ЗначениеЗаполнено(Профиль) Тогда
              УправлениеДоступом.ВключитьПрофильПользователю(Пользователь, Профиль);
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не добавлять пользователя в группу доступа записью справочника напрямую: у
        библиотеки на это своя логика пересчета прав, и запись мимо нее оставит права
        неактуальными.
      - Пересчет прав идет фоново. Сразу после назначения профиля новые ограничения
        могут еще не действовать.
      
      ### 4. Заполнить наборы значений доступа своего объекта
      
      **Задача:** свой документ должен ограничиваться по тем же видам доступа, что и
      типовые.
      
      **Функции:**
      
      Наборы значений доступа заполняются в модуле САМОГО объекта, процедурой
      `ЗаполнитьНаборыЗначенийДоступа`, а не в переопределяемом модуле подсистемы. В
      `УправлениеДоступомПереопределяемый` метода с таким именем НЕТ - там объявляют
      виды доступа и списки с ограничением, а не наборы конкретного объекта.
      
      `УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа(Знач Объект, Таблица, Знач СсылкаНаПодчиненныйОбъект = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеДоступом.ДобавитьНаборыЗначенийДоступа(Приемник, Знач Источник, Знач Умножение = Ложь, Знач Упростить = Ложь) Экспорт`
      - процедура, тот же регион: складывает наборы, в том числе умножением.
      
      `УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК: им объявляют, что объект вообще
      участвует в ограничении доступа.
      
      `УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт`
      - процедура, тот же регион и та же роль: объявляет свой вид доступа.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `УправлениеДоступомПереопределяемый` из прикладного кода:
        их реализуют.
      - Объект, не объявленный в `ПриЗаполненииСписковСОграничениемДоступа`, наборы
        значений не получит, и ограничение на него не подействует. Ошибки при этом нет.
      - Набор значений доступа пересчитывается при записи объекта. Правка данных мимо
        записи объекта оставит набор старым.
      
      ### 5. Запланировать пересчет прав после массовой правки
      
      **Задача:** после загрузки или групповой обработки права должны пересчитаться.
      
      **Функции:**
      
      `УправлениеДоступом.ЗапланироватьОбновлениеДоступа(Таблица) Экспорт` - процедура,
      регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не пересчитывать права синхронно в цикле по объектам: библиотека делает это
        фоново и пакетно, а поштучный пересчет на больших объемах занимает часы.
      - После планирования пересчет идет регламентным заданием. Выключенное задание -
        права не обновятся вовсе.
      
      ## Различия версий
      
      Состав модулей в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check УправлениеДоступом.ЕстьПраво
      ```
      
    • accounting-checks-and-reports.md 7.2 KB
      # Контроль ведения учета и рассылка отчетов
      
      Два механизма БСП, работающих в фоне и показывающих результат человеку: проверки
      корректности данных с регистрацией найденных проблем и рассылка отчетов по
      расписанию.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `КонтрольВеденияУчета` | запуск проверок, регистрация проблем, отчет по ним | сервер, толстый клиент, внешнее соединение |
      | `КонтрольВеденияУчетаПереопределяемый` | точка расширения: свои проверки | сервер, толстый клиент, внешнее соединение |
      | `РассылкаОтчетов` | состав рассылки, получатели, формирование и отправка | сервер, толстый клиент, внешнее соединение |
      | `РассылкаОтчетовПереопределяемый` | точка расширения рассылки | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Выполнить проверку данных
      
      **Задача:** найти документы, нарушающие правило учета, и показать их
      пользователю.
      
      **Функции:**
      
      `КонтрольВеденияУчета.ВыполнитьПроверку(Знач Проверка, Знач ПараметрыВыполненияПроверки = Неопределено, ПроверяемыеОбъекты = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `КонтрольВеденияУчета.ВыполнитьПроверкиВКонтексте(КонтекстПроверокВеденияУчета) Экспорт`
      - процедура, тот же регион.
      
      `КонтрольВеденияУчета.ВидПроверки(Знач ПараметрыВыполненияПроверки, Знач ТолькоПоиск = Ложь) Экспорт`
      и `КонтрольВеденияУчета.ВидыПроверок(ВидПроверок, ПоискПоТочномуСоответствию = Истина) Экспорт`
      - функции, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не писать свой отчет о нарушениях: библиотека ведет регистр проблем,
        показывает их пользователю и снимает при исправлении.
      - Проверка идет по расписанию либо по списку объектов. Полная проверка на большой
        базе долгая, и ее место в регламентном задании.
      - Проблема снимается САМА при повторной проверке. Удалять запись вручную не надо.
      
      ### 2. Объявить свою проверку
      
      **Задача:** правило учета, специфичное для конфигурации, должно проверяться
      наравне с типовыми.
      
      **Функции:**
      
      Процедуры модуля `КонтрольВеденияУчетаПереопределяемый` - регион
      `ПрограммныйИнтерфейс`. ХУКИ: библиотека вызывает их сама.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры переопределяемого модуля из прикладного кода: их
        реализуют.
      - Проверка обязана быть повторяемой: она выполняется многократно, и каждый прогон
        должен давать один и тот же набор проблем на неизменных данных.
      
      ### 3. Выполнить рассылку отчетов
      
      **Задача:** разослать отчет получателям по расписанию либо по команде.
      
      **Функции:**
      
      `РассылкаОтчетов.ВыполнитьРассылкуОтчетов(Рассылка, ПараметрыЖурнала = Неопределено, ДополнительныеНастройки = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `РассылкаОтчетов.ВыполнитьРассылку(Отчеты, ПараметрыДоставки, НаименованиеРассылки = "", ПараметрыЖурнала = Неопределено) Экспорт`
      - функция, тот же регион: разовая рассылка без сохраненной настройки.
      
      `РассылкаОтчетов.ВыполнитьРассылкиВФоновомЗадании(ПараметрыВыполнения, АдресРезультата) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Формирование отчетов и отправка долгие. Из формы это делают фоновым заданием, а
        не синхронно.
      - Две функции с похожими именами делают разное: одна работает по сохраненной
        настройке рассылки, другая по переданному списку отчетов. Перепутать легко.
      - Ошибка доставки одному получателю не отменяет рассылку остальным. Результат
        разбирают по журналу, а не по факту возврата.
      
      ### 4. Добавить свой тип получателей
      
      **Задача:** рассылать не только пользователям, но и своим контрагентам.
      
      **Функции:**
      
      `РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, Настройки) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер. Вызывается из точки
      расширения.
      
      **Нюансы и антипаттерны:**
      
      - Адреса получателей берутся из контактной информации. Свой тип должен уметь ее
        отдавать, иначе рассылка найдет получателей без адресов.
      
      ## Различия версий
      
      Состав модулей обоих механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check РассылкаОтчетов.ВыполнитьРассылкуОтчетов
      ```
      
    • additional-properties.md 8.6 KB
      # Свойства: дополнительные реквизиты и сведения
      
      Механизм БСП, позволяющий пользователю добавить объекту поля без изменения
      конфигурации: дополнительные реквизиты хранятся в самом объекте, дополнительные
      сведения - отдельно от него.
      
      Разница между ними существенна. ДопРеквизит принадлежит объекту и записывается
      вместе с ним; ДопСведение хранится в регистре и правится независимо, в том числе
      когда сам объект править нельзя.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `УправлениеСвойствами` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `УправлениеСвойствамиКлиент` | программный интерфейс клиента: правка значений на форме | тонкий и толстый клиент |
      | `УправлениеСвойствамиПереопределяемый` | точка расширения: свои наборы свойств | сервер, толстый клиент, внешнее соединение |
      | `УправлениеСвойствамиПовтИсп`, `УправлениеСвойствамиСлужебный` | внутренняя реализация библиотеки | - |
      
      **Модуля `Свойства` не существует**, хотя подсистема называется именно так. Все
      методы лежат в `УправлениеСвойствами` и его семействе.
      
      ## Сценарии
      
      ### 1. Прочитать значение дополнительного свойства
      
      **Задача:** в отчете или в проведении использовать поле, добавленное
      пользователем.
      
      **Функции:**
      
      `УправлениеСвойствами.ЗначениеСвойства(Объект, Свойство, КодЯзыка = "") Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеСвойствами.ЗначенияСвойств(ОбъектыСоСвойствами, ПолучатьДопРеквизиты = Истина, ПолучатьДопСведения = Истина, Свойства = Неопределено, КодЯзыка = "") Экспорт`
      - функция, тот же регион: для нескольких объектов и свойств сразу.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция ЗначениеДопРеквизита(Знач Ссылка, Знач Свойство)
      
          Возврат УправлениеСвойствами.ЗначениеСвойства(Ссылка, Свойство);
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не читать табличную часть дополнительных реквизитов объекта запросом напрямую:
        дополнительные СВЕДЕНИЯ там не лежат, они в отдельном регистре, и запрос их
        пропустит.
      - Для списка объектов брать `ЗначенияСвойств`, а не звать одиночную функцию в
        цикле: она читает регистр на каждый вызов.
      
      ### 2. Записать значения свойств объекту
      
      **Задача:** загрузка из внешней системы должна заполнять пользовательские поля.
      
      **Функции:**
      
      `УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеСвойствами.ДобавитьЗначениеСвойства(Знач Владелец, Параметры, Иерархия = Ложь) Экспорт`
      и `УправлениеСвойствами.ПараметрыДобавленияЗначенияСвойства() Экспорт`
      - функции, тот же регион: добавление нового значения в список значений свойства.
      
      **Нюансы и антипаттерны:**
      
      - Не записывать регистр дополнительных сведений набором записей напрямую: у
        библиотеки своя логика по видам свойств и по иерархии значений.
      - Значение должно быть допустимого типа для этого свойства. Библиотека проверяет
        это при записи, а прямая запись в регистр - нет.
      
      ### 3. Вывести свойства на форму
      
      **Задача:** на форме своего объекта показать пользовательские поля так же, как в
      типовых.
      
      **Функции:**
      
      `УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь, СкрытьУдаленные = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеСвойствами.ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект = Неопределено) Экспорт`
      - процедура, тот же регион: обратный перенос перед записью.
      
      `УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(Форма, Объект = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Клиент.
      
      **Нюансы и антипаттерны:**
      
      - Перенос значений с формы в объект вызывается ПЕРЕД записью. Пропуск этого шага
        выглядит как потеря введенных значений без ошибки.
      - Свойства выводятся на форму динамически, элементы создаются библиотекой.
        Обращаться к ним по имени из своего кода нельзя: имена генерируемые.
      
      ### 4. Задать свои наборы свойств
      
      **Задача:** у своего документа должны быть отдельные наборы свойств по видам
      операции.
      
      **Функции:**
      
      `УправлениеСвойствамиПереопределяемый.ЗаполнитьНаборыСвойствОбъекта(Знач Объект, ТипСсылки, НаборыСвойств, СтандартнаяОбработка, КлючНазначения) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт`
      - процедура, тот же регион и та же роль.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `УправлениеСвойствамиПереопределяемый` из прикладного
        кода: их реализуют.
      - Хук вызывается при каждом открытии формы объекта. Запросы в нем идут на каждое
        открытие, и тяжелая выборка там заметна пользователю.
      
      ## Различия версий
      
      Состав модулей и их экспортные методы в 3.1.11 и 3.2.1 совпадают - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check УправлениеСвойствами.ЗначениеСвойства
      ```
      
    • address-classifier.md 4.4 KB
      # Адресный классификатор
      
      Механизм БСП, работающий с государственным адресным реестром: загруженные регионы,
      поиск адресных объектов, коды и наименования, проверка адреса по классификатору.
      
      Работает в паре с контактной информацией: та хранит адрес объекта, этот проверяет
      и разбирает его по реестру.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `АдресныйКлассификатор` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `АдресныйКлассификаторКлиент` | клиентская часть | тонкий и толстый клиент |
      
      ## Сценарии
      
      ### 1. Проверить, загружен ли классификатор
      
      **Задача:** до разбора адреса убедиться, что данные есть.
      
      **Функции:**
      
      `АдресныйКлассификатор.АдресныйКлассификаторЗагружен() Экспорт` - функция, регион
      `ПрограммныйИнтерфейс`. Сервер.
      
      `АдресныйКлассификатор.КоличествоЗагруженныхРегионов() Экспорт` - функция, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Классификатор грузится ПО РЕГИОНАМ, а не целиком. Загруженность вообще не
        означает, что есть нужный регион.
      - Без проверки разбор адреса тихо вернет пустой результат, и адрес окажется
        введенным в свободной форме.
      
      ### 2. Перевести код региона в наименование и обратно
      
      **Задача:** в отчете показать название субъекта по коду из адреса.
      
      **Функции:**
      
      `АдресныйКлассификатор.НаименованиеРегионаПоКоду(КодСубъектаРФ) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `АдресныйКлассификатор.КодРегионаПоНаименованию(Название) Экспорт` - функция, тот
      же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не держать свой список регионов константой: коды и наименования меняются, а
        библиотека берет их из загруженного реестра.
      - Поиск по наименованию неточен по природе: одно и то же название пишется
        по-разному, и пустой ответ не означает отсутствия региона.
      
      ### 3. Получить коды адреса
      
      **Задача:** для выгрузки в госорган нужны коды адресных объектов, а не текст.
      
      **Функции:**
      
      `АдресныйКлассификатор.КодыАдреса(Адрес, Источник = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Адрес, введенный в свободной форме, кодов не имеет. Это видно функцией
        `УправлениеКонтактнойИнформацией.АдресВведенВСвободнойФорме`.
      - Источник кодов различается между реестрами. Полагаться на источник по умолчанию
        при выгрузке в госорган нельзя.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check АдресныйКлассификатор.КодыАдреса
      ```
      
    • administration.md 7.9 KB
      # Администрирование: сеансы, безопасный режим, контроль работы, копирование
      
      Четыре механизма БСП для администратора: завершение работы пользователей,
      профили безопасности и выполнение кода с разрешениями, отчеты о действиях
      пользователей по журналу регистрации, резервное копирование базы.
      
      **Имена модулей здесь расходятся с названиями подсистем сильнее всего.** Проверено
      по обеим поставкам:
      
      | Подсистема называется | А модуль называется |
      |---|---|
      | Завершение работы пользователей | `СоединенияИБ` |
      | Профили безопасности | `РаботаВБезопасномРежиме` |
      | Резервное копирование ИБ | `РезервноеКопированиеИБКлиент` и семейство |
      | Контроль работы пользователей | `КонтрольРаботыПользователей` (совпадает) |
      
      Модулей `ЗавершениеРаботыПользователей` и `ПрофилиБезопасности` в библиотеке НЕТ.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `СоединенияИБ` | блокировка новых сеансов, отключение активных соединений | сервер, толстый клиент, внешнее соединение |
      | `РаботаВБезопасномРежиме` | запросы разрешений на внешние ресурсы и выполнение кода с ними | сервер, толстый клиент, внешнее соединение |
      | `КонтрольРаботыПользователей` | отчеты о действиях по журналу регистрации | сервер, толстый клиент, внешнее соединение |
      | `РезервноеКопированиеИБКлиент` и семейство из пяти модулей | резервное копирование | клиент / сервер |
      | `БлокировкаРаботыСВнешнимиРесурсами` | блокировка внешних ресурсов при копировании базы | сервер |
      
      ## Сценарии
      
      ### 1. Завершить работу пользователей перед обновлением
      
      **Задача:** заблокировать новые сеансы и отключить активные.
      
      **Механизм:** модуль `СоединенияИБ`, регион `ПрограммныйИнтерфейс`. Сервер.
      Восемь методов: блокировка начала сеансов, перечень активных соединений,
      отключение.
      
      **Нюансы и антипаттерны:**
      
      - Не устанавливать блокировку сеансов платформенными средствами напрямую:
        библиотека показывает пользователям понятное предупреждение и дает время
        завершить работу.
      - Отключение активных соединений не мгновенное: часть сеансов завершается с
        задержкой, и код обновления должен это учитывать.
      
      ### 2. Запросить разрешение на внешний ресурс
      
      **Задача:** обработка обращается в интернет или к файлу, а в базе включены
      профили безопасности.
      
      **Функции:**
      
      Модуль `РаботаВБезопасномРежиме`, регион `ПрограммныйИнтерфейс`. Сервер.
      Запросы на использование файлов, интернета, COM и внешних компонент, а также
      выполнение кода с полученными разрешениями.
      
      **Нюансы и антипаттерны:**
      
      - Разрешение запрашивается ДО операции и подтверждается администратором. Код,
        идущий во внешний ресурс без запроса, при включенных профилях просто упадет.
      - Не отключать профили безопасности ради работы своей обработки: это снимает
        защиту со всей базы, а не с одной операции.
      
      ### 3. Настроить регистрацию доступа к данным
      
      **Задача:** вести учет того, кто и какие данные смотрел.
      
      **Функции:**
      
      `КонтрольРаботыПользователей.РегистрироватьДоступКДанным() Экспорт` - функция,
      регион `ПрограммныйИнтерфейс`. Сервер.
      
      `КонтрольРаботыПользователей.УстановитьРегистрациюДоступаКДанным(РегистрироватьДоступКДанным) Экспорт`
      - процедура, тот же регион.
      
      `КонтрольРаботыПользователей.НастройкиРегистрацииСобытийДоступаКДанным() Экспорт`
      и `КонтрольРаботыПользователей.УстановитьНастройкиРегистрацииСобытийДоступаКДанным(Настройки) Экспорт`
      - функция и процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Регистрация доступа заметно нагружает журнал. Включать ее на все объекты сразу
        не следует: настройка задается по видам событий и объектам.
      - Отчеты строятся ПО ЖУРНАЛУ регистрации. Очищенный журнал означает пустой отчет,
        и это не ошибка механизма.
      
      ### 4. Резервное копирование
      
      **Задача:** предложить пользователю сделать копию перед рискованной операцией.
      
      **Механизм:** семейство `РезервноеКопированиеИБ`. Публичный интерфейс клиентский:
      копирование это действие администратора на его рабочем месте.
      
      **Нюансы и антипаттерны:**
      
      - Копирование доступно не во всех вариантах работы. Проверять доступность до
        показа команды обязательно.
      - На время копирования работа с внешними ресурсами блокируется отдельным
        механизмом: `БлокировкаРаботыСВнешнимиРесурсами`. Иначе восстановленная копия
        начнет слать письма и обмениваться данными как рабочая база.
      
      ## Различия версий
      
      Состав модулей всех четырех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      Имена здесь расходятся с названиями подсистем, поэтому проверка обязательна:
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py module СоединенияИБ
      ```
      
    • attachable-commands.md 9 KB
      # Подключаемые команды
      
      Механизм БСП, позволяющий одной подсистеме добавить команду на форму объекта,
      принадлежащего другой подсистеме: печать, отправка почтой, создание на основании,
      дополнительные обработки. Форма объекта при этом ничего о них не знает.
      
      Через этот механизм на форму попадают команды печати и команды дополнительных
      обработок - они не отдельные механизмы размещения, а его потребители.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ПодключаемыеКоманды` | программный интерфейс сервера: сбор состава и размещение | сервер, толстый клиент, внешнее соединение |
      | `ПодключаемыеКомандыКлиент` | программный интерфейс клиента: выполнение команды | тонкий и толстый клиент |
      | `ПодключаемыеКомандыКлиентСервер` | общая часть | сервер и клиент |
      | `ПодключаемыеКомандыПереопределяемый` | точка расширения: свои виды команд | сервер, толстый клиент, внешнее соединение |
      | `ПодключаемыеКомандыГлобальный`, `...ВызовСервера`, `...ПовтИсп`, `...КлиентПовтИсп` | внутренняя реализация библиотеки | - |
      
      ## Сценарии
      
      ### 1. Подключить механизм к своей форме
      
      **Задача:** на форме своего документа должны появиться команды печати, отправки
      и дополнительных обработок.
      
      **Функции:**
      
      `ПодключаемыеКоманды.ПриСозданииНаСервере(Форма, Знач ПараметрыРазмещения = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ПодключаемыеКоманды.ПараметрыРазмещения() Экспорт` - функция-конструктор, тот же
      регион.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      
          ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтаФорма);
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Один вызов подключает ВСЕ команды сразу: печать, почту, дополнительные
        обработки. Отдельно подключать печать не нужно и неверно.
      - Параметры размещения задают, в какие группы формы попадут команды. Без них
        библиотека выбирает группы сама, и на нестандартной форме результат бывает не
        тем, что ожидался.
      
      ### 2. Выполнить подключаемую команду
      
      **Задача:** обработчик команды на форме должен передать управление библиотеке.
      
      **Функции:**
      
      `ПодключаемыеКомандыКлиент.ВыполнитьКоманду(Форма, Команда, Источник) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Клиент.
      
      `ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(Форма, Команда, Знач Источник = Неопределено) Экспорт`
      - процедура, тот же регион: асинхронный вариант.
      
      `ПодключаемыеКоманды.ВыполнитьКоманду(Знач Форма, Знач ПараметрыВызова, Знач Источник = Неопределено, Результат = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Обработчик команды на форме создается библиотекой, свой писать не нужно. Своя
        реализация появляется только тогда, когда команда нетиповая.
      - Клиентский и серверный `ВыполнитьКоманду` это РАЗНЫЕ процедуры с разными
        сигнатурами. Путать их легко: имена совпадают.
      
      ### 3. Обновить состав команд после записи
      
      **Задача:** после проведения документа набор доступных команд меняется.
      
      **Функции:**
      
      `ПодключаемыеКомандыКлиент.ПослеЗаписи(Форма, Объект, ПараметрыЗаписи) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Клиент.
      
      `ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(Форма, Элемент = Неопределено, Строка = Неопределено) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Без вызова после записи команды останутся в состоянии, которое было до нее:
        например печать будет недоступна у только что записанного документа.
      - Обновление асинхронное. Проверять доступность команды сразу после вызова
        бессмысленно.
      
      ### 4. Ограничить видимость команды
      
      **Задача:** команда должна показываться только для определенного вида операции.
      
      **Функции:**
      
      `ПодключаемыеКоманды.ДобавитьУсловиеВидимостиКоманды(Команда, Реквизит, Значение = Неопределено, Знач ВидСравнения = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Условие вычисляет библиотека по реквизиту объекта. Свой код в форме для того же
        отработает на каждое открытие, а условие - один раз на список.
      - Условие видимости это не право доступа. Скрытая команда остается вызываемой,
        если пользователь дотянется до нее иначе.
      
      ### 5. Объявить свой вид подключаемых команд
      
      **Задача:** своя подсистема должна добавлять команды на чужие формы.
      
      **Функции:**
      
      `ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт`
      - процедура, тот же регион и та же роль.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `ПодключаемыеКомандыПереопределяемый` из прикладного
        кода: их реализуют.
      - Хук вызывается для КАЖДОЙ формы, куда подключен механизм. Тяжелая работа в нем
        замедляет открытие всех таких форм, а не только своей.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ПодключаемыеКоманды.ПриСозданииНаСервере
      ```
      
    • attached-files.md 12.5 KB
      # Работа с файлами
      
      Механизм БСП, присоединяющий файлы к объектам конфигурации: договор со сканом,
      заказ с накладной, элемент справочника с фотографией. Хранение в базе либо в
      томах на диске, версии файла, редактирование во внешней программе.
      
      Не путать с выгрузкой объектов в файлы: там сериализация данных, здесь
      пользовательские файлы, привязанные к объекту.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `РаботаСФайлами` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `РаботаСФайламиКлиент` | программный интерфейс клиента: открытие, добавление, редактирование, сканирование | тонкий и толстый клиент |
      | `РаботаСФайламиКлиентСервер` | общая часть: разбор имен, проверка расширений | сервер и клиент |
      | `РаботаСФайламиПереопределяемый`, `РаботаСФайламиКлиентПереопределяемый` | точки расширения сервера и клиента | сервер / клиент |
      | `РаботаСФайламиЛокализация` | национальная специфика | сервер |
      | `РаботаСФайламиСлужебный` и еще восемь | внутренняя реализация библиотеки | - |
      
      Клиентский модуль здесь БОЛЬШЕ серверного: 53 метода против 38. Работа с файлом -
      действие пользователя, и почти все команды живут на клиенте.
      
      ## Сценарии
      
      ### 1. Прочитать файл, присоединенный к объекту
      
      **Задача:** получить двоичные данные вложения, чтобы отправить его почтой или
      разобрать.
      
      **Функции:**
      
      `РаботаСФайлами.ДвоичныеДанныеФайла(Знач ПрисоединенныйФайл, Знач ВызыватьИсключение = Истина) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `РаботаСФайлами.ДвоичныеДанныеФайлов(Знач ПрисоединенныеФайлы, Знач ВызыватьИсключение = Истина) Экспорт`
      - функция, тот же регион: для нескольких файлов сразу.
      
      `РаботаСФайлами.ДанныеФайла(Знач ПрисоединенныйФайл, Знач ДополнительныеПараметры = Неопределено, Знач УдалитьПолучатьСсылкуНаДвоичныеДанные = Истина, Знач УдалитьДляРедактирования = Ложь) Экспорт`
      - функция, тот же регион: структура со сведениями о файле, а не сами данные.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция СодержимоеВложения(Знач ФайлСсылка)
      
          Возврат РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка, Ложь);
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не читать реквизит хранилища значения справочника файлов напрямую: файл может
        лежать в томе на диске, а не в базе, и в хранилище его не будет.
      - Для нескольких файлов брать `ДвоичныеДанныеФайлов`, а не звать одиночную
        функцию в цикле: она ходит в тома по одному разу на файл.
      - Параметр `ВызыватьИсключение` со значением `Ложь` возвращает `Неопределено`
        вместо ошибки, когда файла нет. Для фоновой обработки это нужнее исключения.
      
      ### 2. Присоединить файл к объекту из кода
      
      **Задача:** загрузка из внешней системы должна класть документы к заказу.
      
      **Функции:**
      
      `РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, Знач АдресФайлаВоВременномХранилище, Знач АдресВременногоХранилищаТекста = "", Знач Описание = "", Знач НоваяСсылкаНаФайл = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `РаботаСФайлами.ДобавитьФайлСДиска(ВладелецФайлов, ПутьКФайлуНаДиске) Экспорт`
      - функция, тот же регион.
      
      `РаботаСФайлами.НоваяСсылкаНаФайл(ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не создавать элемент справочника присоединенных файлов записью объекта: мимо
        библиотеки не запишутся версия, размер, признак хранения в томе.
      - Владелец должен допускать присоединение файлов - проверяется функцией
        `РаботаСФайлами.КОбъектуМожноПрисоединятьФайлы`. Иначе файл повиснет без хозяина.
      - `ДобавитьФайлСДиска` читает путь НА СЕРВЕРЕ. Для файла с машины пользователя
        сначала помещают его во временное хранилище на клиенте.
      
      ### 3. Открыть файл у пользователя
      
      **Задача:** по команде формы показать вложение во внешней программе.
      
      **Функции:**
      
      `РаботаСФайламиКлиент.ОткрытьФайл(Знач ДанныеФайла, Знач ДляРедактирования = Ложь) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Тонкий и толстый клиент.
      
      `РаботаСФайламиКлиент.ДанныеФайла(Знач ФайлСсылка, Знач ИдентификаторФормы = Неопределено, Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, Знач ДляРедактирования = Ложь) Экспорт`
      - функция, тот же регион.
      
      `РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла) Экспорт` - процедура, тот
      же регион.
      
      **Пример:**
      
      ```bsl
      &НаКлиенте
      Процедура ОткрытьВложение(Команда)
      
          ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(Элементы.Файлы.ТекущаяСтрока,
              УникальныйИдентификатор);
          РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла);
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не звать серверный `РаботаСФайлами.ДанныеФайла` из клиентского обработчика: у
        него контексты сервера, толстого клиента и внешнего соединения. Для клиента
        есть одноименная функция в модуле с суффиксом `Клиент`, и сигнатуры у них
        РАЗНЫЕ.
      - Идентификатор формы передается, чтобы данные во временном хранилище жили,
        пока открыта форма. Без него ссылка протухнет.
      
      ### 4. Добавить файл действием пользователя
      
      **Задача:** кнопка на форме, открывающая диалог выбора файла.
      
      **Функции:**
      
      `РаботаСФайламиКлиент.ДобавитьФайл(ОбработчикРезультата, ВладелецФайла, ФормаВладелец, РежимСоздания = Неопределено, ПараметрыДобавления = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Клиент.
      
      `РаботаСФайламиКлиент.ДобавитьФайлы(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач Фильтр = "", ГруппаФайлов = Неопределено, ОбработчикРезультата = Неопределено) Экспорт`
      - процедура, тот же регион: несколько файлов сразу.
      
      `РаботаСФайламиКлиент.ДобавитьСоСканера(ПараметрыДобавления, ПараметрыСканирования = Неопределено) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Работа асинхронная: результат приходит в обработчик оповещения, а не
        возвращается из процедуры. Код после вызова выполняется ДО того, как
        пользователь выбрал файл.
      - Не собирать диалог выбора файла самостоятельно: библиотека проверяет
        расширение, размер и настройки хранения, а свой диалог этого не делает.
      
      ### 5. Ограничить, какие файлы принимаются
      
      **Задача:** запретить вложения сверх размера или с опасным расширением.
      
      **Функции:**
      
      `РаботаСФайлами.МаксимальныйРазмерФайла() Экспорт` и
      `РаботаСФайлами.МаксимальныйРазмерФайлаОбщий() Экспорт` - функции, регион
      `ПрограммныйИнтерфейс`. Сервер.
      
      `РаботаСФайлами.НастройкиРаботыСФайлами() Экспорт` - функция, тот же регион.
      
      `РаботаСФайламиПереопределяемый.ПриОпределенииНастроек(Настройки) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      **Нюансы и антипаттерны:**
      
      - Не проверять размер и расширение своим кодом до вызова библиотеки: настройки
        меняются администратором, и своя проверка разойдется с настройкой.
      - Не вызывать процедуры `РаботаСФайламиПереопределяемый` из прикладного кода: их
        реализуют.
      
      ## Различия версий
      
      В 3.2.1 появился служебный модуль `РаботаСФайламиВХранилищеДвоичныхДанныхСлужебный`,
      которого нет в 3.1.11 - сверено по обеим поставкам. Модуль служебный, на
      прикладной код это не влияет, но объясняет разницу в составе семейства.
      
      Состав публичных модулей и их экспортных методов в этих версиях совпадает.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check РаботаСФайлами.ДвоичныеДанныеФайла
      ```
      
    • attribute-locking.md 8.4 KB
      # Запрет редактирования реквизитов объектов
      
      Механизм БСП, блокирующий на форме ключевые реквизиты после того, как объект
      проведен или уже использован: организация, склад, договор. Пользователь видит
      кнопку разблокировки и снимает запрет осознанно, а не правит поле случайно.
      
      Не путать с датами запрета изменения: там запрет по периоду для всего объекта,
      здесь блокировка отдельных полей на форме.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ЗапретРедактированияРеквизитовОбъектов` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ЗапретРедактированияРеквизитовОбъектовКлиент` | программный интерфейс клиента: разблокировка на форме | тонкий и толстый клиент |
      | `ЗапретРедактированияРеквизитовОбъектовПереопределяемый` | точка расширения: свои запрещенные реквизиты | сервер, толстый клиент, внешнее соединение |
      | `ЗапретРедактированияРеквизитовОбъектовСлужебный`, `...СлужебныйКлиент` | внутренняя реализация библиотеки | - |
      
      Серверный модуль здесь маленький - три метода. Основная работа на клиенте: запрет
      это состояние формы, а не данных.
      
      ## Сценарии
      
      ### 1. Заблокировать реквизиты на форме объекта
      
      **Задача:** после проведения документа ключевые поля должны стать недоступными.
      
      **Функции:**
      
      `ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(Форма, ГруппаДляКнопкиЗапрета = Неопределено, ЗаголовокКнопкиЗапрета = "", Объект = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      
          ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма);
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Вызов идет в `ПриСозданииНаСервере` формы: библиотека добавляет на форму кнопку
        разблокировки, а элементы к моменту открытия должны быть на месте.
      - Не гасить доступность полей своим кодом: тогда пользователь не получит кнопку
        разблокировки и не сможет исправить ошибку ввода вовсе.
      
      ### 2. Объявить, какие реквизиты блокируются
      
      **Задача:** для своего документа задать перечень ключевых полей.
      
      **Функции:**
      
      `ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъектаМетаданных, ЗаблокированныеРеквизиты) Экспорт`
      - процедура, тот же регион и та же роль.
      
      `ЗапретРедактированияРеквизитовОбъектов.НовыйБлокируемыйРеквизит() Экспорт`
      - функция-конструктор, регион `ПрограммныйИнтерфейс`.
      
      `ЗапретРедактированияРеквизитовОбъектов.БлокируемыеРеквизитыОбъекта(ИмяОбъекта) Экспорт`
      - функция, тот же регион: что уже объявлено.
      
      **Пример:**
      
      ```bsl
      // Модуль ЗапретРедактированияРеквизитовОбъектовПереопределяемый, тело хука.
      Процедура ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъектаМетаданных, ЗаблокированныеРеквизиты) Экспорт
      
          Если ИмяОбъектаМетаданных = "Документ.РасходТовара" Тогда
              Реквизит = ЗапретРедактированияРеквизитовОбъектов.НовыйБлокируемыйРеквизит();
              Реквизит.Имя = "Организация";
              ЗаблокированныеРеквизиты.Добавить(Реквизит);
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Объект должен быть назван в ОБОИХ хуках: сначала в перечне объектов, затем в
        перечне его реквизитов. Пропуск первого выглядит как работающий механизм без
        блокировок.
      - Не вызывать процедуры переопределяемого модуля из прикладного кода: их
        реализуют.
      
      ### 3. Разблокировать реквизиты по действию пользователя
      
      **Задача:** своя команда должна снимать запрет так же, как типовая кнопка.
      
      **Функции:**
      
      `ЗапретРедактированияРеквизитовОбъектовКлиент.РазрешитьРедактированиеРеквизитовОбъекта(Знач Форма, ОбработкаПродолжения = Неопределено, ТолькоВидимые = Истина) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Клиент.
      
      `ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(Знач Форма, Знач Реквизиты = Неопределено) Экспорт`
      - процедура, тот же регион.
      
      `ЗапретРедактированияРеквизитовОбъектовКлиент.Реквизиты(Знач Форма, Знач ТолькоЗаблокированные = Истина, ТолькоВидимые = Истина) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Разблокировка асинхронная: пользователю задается вопрос, и результат приходит
        в обработку продолжения. Код после вызова выполняется ДО ответа.
      - Не звать серверный модуль механизма с клиента: у него нет контекста тонкого
        клиента, а разблокировка это клиентское действие.
      
      ## Различия версий
      
      Состав модулей и их экспортные методы в 3.1.11 и 3.2.1 совпадают - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты
      ```
      
    • base-functionality.md 12.3 KB
      # Базовая функциональность
      
      Базовые модули библиотеки, на которые опираются остальные механизмы: чтение реквизитов объектов без чтения самих объектов, сообщения
      пользователю, работа с коллекциями, свойства сеанса и окружения, безопасный режим
      выполнения. Самый большой механизм БСП - 211 методов только в серверном модуле.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ОбщегоНазначения` | базовый серверный модуль, 211 методов | сервер, толстый клиент, внешнее соединение |
      | `ОбщегоНазначенияКлиентСервер` | то, что работает и на клиенте: коллекции, пути, отборы, адреса почты | сервер и клиент |
      | `ОбщегоНазначенияКлиент` | клиентские свойства сеанса, оповещения, типовые диалоги | тонкий и толстый клиент |
      | `ОбщегоНазначенияПереопределяемый` | точки расширения ядра, переименования объектов при обновлении | сервер, толстый клиент, внешнее соединение |
      | `ОбщегоНазначенияВызовСервера` | вызов с клиента напрямую | сервер |
      
      **Суффикс здесь особенно важен.** У одноименных методов разных модулей бывают
      разные сигнатуры и разное поведение, и выбор модуля определяется тем, откуда идет
      вызов, а не тем, что удобнее написать.
      
      ## Сценарии
      
      ### 1. Прочитать реквизит объекта, не читая объект
      
      **Задача:** узнать одно поле документа в цикле или в отчете, не поднимая весь
      объект из базы.
      
      **Функции:**
      
      `ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт`
      - функция, тот же регион: несколько реквизитов одного объекта.
      
      `ОбщегоНазначения.ЗначенияРеквизитовОбъектов(Знач Ссылки, Знач Реквизиты, Знач ВыбратьРазрешенные = Ложь) Экспорт`
      - функция, тот же регион: несколько реквизитов у СПИСКА объектов, одним запросом.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция ОрганизацииДокументов(Знач Ссылки)
      
          Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъектов(Ссылки, "Организация");
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не писать обращение вида точка-реквизит по ссылке в цикле: каждое обращение это отдельное чтение
        объекта из базы. На сотне строк разница уже заметна, на тысячах - критична.
      - Для СПИСКА объектов брать `ЗначенияРеквизитовОбъектов` во множественном числе:
        одиночная функция в цикле сделает столько запросов, сколько объектов. Имена
        трех функций различаются одной буквой, и перепутать их легко.
      
      ### 2. Сообщить пользователю
      
      **Задача:** показать сообщение, привязанное к полю формы, и прервать запись.
      
      **Функции:**
      
      `ОбщегоНазначения.СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Знач ПутьКДанным = "", Отказ = Ложь) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбщегоНазначенияКлиент.СообщитьПользователю(...)` - парная процедура для клиента,
      тот же регион.
      
      **Пример:**
      
      ```bsl
      // Модуль объекта документа.
      Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
      
          Если Не ЗначениеЗаполнено(Контрагент) Тогда
              ОбщегоНазначения.СообщитьПользователю(
                  "Не заполнен контрагент", ЭтотОбъект, "Контрагент", , Отказ);
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не использовать платформенный `Новый СообщениеПользователю` с последующим
        `Сообщить`: библиотека сама расставит привязку к полю и учтет контекст
        выполнения, в том числе фоновое задание.
      - **В `ОбщегоНазначенияКлиентСервер` этой процедуры НЕТ.** Она есть только в
        серверном модуле и в клиентском. Попытка позвать ее из общего модуля даст
        ошибку компиляции.
      - Параметр `Отказ` передается по ссылке и взводится процедурой. Взводить его
        отдельно не нужно.
      
      ### 3. Работа с коллекциями
      
      **Задача:** объединить структуры, дополнить массив, выгрузить колонку таблицы.
      
      **Функции:**
      
      `ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт`,
      `ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт`,
      `ОбщегоНазначенияКлиентСервер.ДополнитьСоответствие(Приемник, Источник, Заменять = Неопределено) Экспорт`,
      `ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. Доступны и на клиенте, и на сервере.
      
      `ОбщегоНазначения.ВыгрузитьКолонку(КоллекцияСтрок, ИмяКолонки, ТолькоУникальныеЗначения = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - **Функции `КопироватьРекурсивно` в БСП НЕТ**, проверено. Имя выглядит
        правдоподобно и встречается в чужих подсказках, в том числе в прежней редакции
        описания этого скила. Глубокая копия структуры, соответствия или массива
        делается функцией `ОбщегоНазначения.СкопироватьРекурсивно(Источник, ФиксироватьДанные = Неопределено) Экспорт`
        - разница в одной приставке, и она решает.
      - Коллекционные процедуры лежат в `КлиентСервер`, а не в серверном модуле:
        серверный вызов ради них не нужен.
      
      ### 4. Выполнить сторонний код в безопасном режиме
      
      **Задача:** исполнить алгоритм из настройки или из внешней обработки, не дав ему
      доступа к файловой системе.
      
      **Функции:**
      
      `ОбщегоНазначения.ВыполнитьВБезопасномРежиме(Знач Алгоритм, Знач Параметры = Неопределено, Знач ПараметрыПроверкиАлгоритма = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбщегоНазначения.ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено, ЭтоФункция = Ложь) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не звать платформенный `Выполнить` напрямую для стороннего кода: безопасный
        режим и профили безопасности при этом не действуют.
      - У `ВыполнитьМетодКонфигурации` между версиями 3.1.11 и 3.2.1 изменилась форма:
        она стала функцией. Код, написанный по новой сигнатуре, на старой версии
        отработает иначе - смотреть карточку метода в справочнике перед использованием.
      
      ### 5. Свойства сеанса и окружения
      
      **Задача:** ветвление по режиму работы: файловая база, модель сервиса, разделение
      данных.
      
      **Функции:**
      
      `ОбщегоНазначения.РазделениеВключено() Экспорт`,
      `ОбщегоНазначения.ИнформационнаяБазаФайловая() Экспорт`,
      `ОбщегоНазначения.ЭтоВебКлиент() Экспорт` - функции, регион
      `ПрограммныйИнтерфейс`. Часть из них есть и в клиентском модуле.
      
      **Нюансы и антипаттерны:**
      
      - Не определять режим работы разбором строки соединения: библиотека учитывает и
        модель сервиса, и внешнее соединение.
      - Клиентские и серверные варианты этих функций возвращают одно и то же, но
        вызываются из своего контекста. Серверный вызов с клиента ради них не нужен.
      
      ## Различия версий
      
      `ОбщегоНазначения.ВыполнитьМетодКонфигурации` между 3.1.11 и 3.2.1 сменила форму:
      из процедуры стала функцией. Это ломающее изменение, и справочник `1c-bsp-api`
      помечает такие методы отдельно.
      
      Состав модулей семейства в этих версиях совпадает.
      
      ## Проверка перед использованием
      
      Модуль большой, и похожие имена в нем встречаются часто. Проверять обязательно:
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ОбщегоНазначения.ЗначенияРеквизитовОбъектов
      ```
      
    • bulk-data-operations.md 8.1 KB
      # Массовые операции с данными
      
      Четыре механизма БСП, работающих с данными пачками: загрузка из файла в
      справочники, групповое изменение реквизитов, выгрузка объектов в файлы, отчет о
      структуре подчиненности документов.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `ЗагрузкаДанныхИзФайла` | загрузка табличных данных в справочники с сопоставлением | сервер, толстый клиент, внешнее соединение |
      | `ЗагрузкаДанныхИзФайлаКлиентСервер` | общие правила разбора загружаемых данных | сервер и клиент |
      | `ГрупповоеИзменениеОбъектовКлиент` | клиентская часть группового изменения | тонкий и толстый клиент |
      | `ГрупповоеИзменениеОбъектовПереопределяемый` | точка расширения группового изменения | сервер, толстый клиент, внешнее соединение |
      | `ВыгрузкаОбъектовВФайлы` | выгрузка объектов в файлы для последующей загрузки | сервер, толстый клиент, внешнее соединение |
      | `СтруктураПодчиненностиПереопределяемый` | точка расширения отчета о связях документов | сервер, толстый клиент, внешнее соединение |
      
      **У группового изменения и структуры подчиненности в публичном интерфейсе нет
      серверного модуля без суффикса.** У первого доступны клиентская часть и точка
      расширения, у второй только точка расширения: сами механизмы работают обработкой
      и отчетом, а не вызовами из прикладного кода.
      
      ## Сценарии
      
      ### 1. Описать, что можно загружать из файла
      
      **Задача:** свой справочник должен принимать загрузку из таблицы.
      
      **Функции:**
      
      `ЗагрузкаДанныхИзФайла.ОписаниеЗагружаемыхДанныхДляСправочников(ЗагружаемыеДанные, ОписаниеТипаОбъектаСопоставления, ЗаголовокКолонкиОбъектаСопоставления) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных() Экспорт` - функция-конструктор,
      тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не писать свой разбор таблицы: библиотека берет на себя сопоставление колонок,
        распознавание существующих элементов и разбор неоднозначностей.
      - Колонка сопоставления это то, по чему строка файла узнается в базе. Без нее
        загрузка создаст дубли вместо обновления.
      
      ### 2. Разобрать неоднозначности загрузки
      
      **Задача:** строка файла подошла к нескольким элементам справочника.
      
      **Функции:**
      
      `ЗагрузкаДанныхИзФайла.НовыйСписокНеоднозначностей() Экспорт` - функция, регион
      `ПрограммныйИнтерфейс`. Сервер.
      
      `ЗагрузкаДанныхИзФайла.ЗаписатьСвойстваОбъекта(СсылкаНаОбъект, СтрокаТаблицы) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Неоднозначность это не ошибка файла: одинаковые наименования у разных элементов
        штатны. Решение принимает пользователь, и механизм для этого есть.
      - Молчаливый выбор первого подходящего элемента дает загрузку не туда, и это
        всплывает много позже.
      
      ### 3. Выгрузить объекты в файлы
      
      **Задача:** сохранить пачку объектов в файлы заданного формата.
      
      **Функции:**
      
      `ВыгрузкаОбъектовВФайлы.СохранитьПоФорматуВФайл(КомандыВыгрузки, СписокОбъектов, НастройкиСохранения) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер. Публичный интерфейс механизма
      состоит из одного метода.
      
      **Нюансы и антипаттерны:**
      
      - Не путать с обменом данными: здесь файлы для человека либо для внешней системы,
        а не сообщение синхронизации.
      - Выгрузка на большом списке долгая. Ее место - фоновое задание.
      
      ### 4. Вмешаться в отчет о структуре подчиненности
      
      **Задача:** в дереве связанных документов показать свои объекты по-своему.
      
      **Функции:**
      
      `СтруктураПодчиненностиПереопределяемый.ПередВыводомСвязанногоОбъекта(Объект, СвойстваОбъекта, Отказ) Экспорт`
      и `СтруктураПодчиненностиПереопределяемый.ПриПолученииПредставления(ТипДанных, Данные, Представление, СтандартнаяОбработка) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. ХУКИ.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры переопределяемого модуля из прикладного кода: их
        реализуют.
      - Хуки вызываются на КАЖДЫЙ узел дерева. Запрос внутри них дает столько запросов,
        сколько связанных документов.
      
      ### 5. Дополнить групповое изменение
      
      **Задача:** свой объект должен поддерживать групповую правку реквизитов.
      
      **Функции:**
      
      Процедуры модуля `ГрупповоеИзменениеОбъектовПереопределяемый` - регион
      `ПрограммныйИнтерфейс`. ХУКИ.
      
      `ГрупповоеИзменениеОбъектовКлиент` - клиентская часть, вызывается из формы.
      
      **Нюансы и антипаттерны:**
      
      - Групповое изменение записывает объекты по одному, со всеми проверками и
        подписками. Это не пакетная запись, и на больших списках она долгая.
      
      ## Различия версий
      
      Состав модулей всех четырех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных
      ```
      
    • business-processes.md 6.1 KB
      # Бизнес-процессы и задачи
      
      Механизм БСП поверх бизнес-процессов и задач платформы: адресация задач по ролям
      и объектам адресации, отложенный старт процессов, выполнение задач, связь ведущих
      и подчиненных процессов.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `БизнесПроцессыИЗадачиСервер` | программный интерфейс сервера, 72 метода | сервер, толстый клиент, внешнее соединение |
      | `БизнесПроцессыИЗадачиКлиент` | программный интерфейс клиента: команды на форме | тонкий и толстый клиент |
      | `БизнесПроцессыИЗадачиПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      
      **Модуля `БизнесПроцессыИЗадачи` без суффикса не существует**: программный
      интерфейс лежит в `БизнесПроцессыИЗадачиСервер`.
      
      ## Сценарии
      
      ### 1. Выполнить задачу из кода
      
      **Задача:** автоматически закрыть задачу по наступлению события.
      
      **Функции:**
      
      `БизнесПроцессыИЗадачиСервер.ВыполнитьЗадачу(ЗадачаСсылка, ДействиеПоУмолчанию = Ложь) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не записывать реквизит выполнения задачи объектом: тогда бизнес-процесс не
        продвинется по маршруту и повиснет.
      - Выполнение задачи двигает процесс дальше и может создать новые задачи. Это
        не запись одной записи, а шаг маршрута.
      
      ### 2. Найти исполнителей по адресации
      
      **Задача:** понять, кому адресована задача роли.
      
      **Функции:**
      
      `БизнесПроцессыИЗадачиСервер.ГруппаИсполнителейЗадач(РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Адресация трехмерная: роль плюс два объекта адресации. Поиск исполнителя только
        по роли дает не тот состав.
      - Пустой объект адресации это не ошибка, а более широкая адресация. Трактовать
        его как отсутствие исполнителей неверно.
      
      ### 3. Запустить процесс отложенно
      
      **Задача:** процесс должен стартовать не сейчас, а в назначенную дату.
      
      **Функции:**
      
      `БизнесПроцессыИЗадачиСервер.ДобавитьПроцессДляОтложенногоСтарта(Процесс, ДатаСтарта) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `БизнесПроцессыИЗадачиСервер.ДатаОтложенногоСтартаПроцесса(БизнесПроцесс) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Отложенный старт выполняется регламентным заданием. Выключенное задание -
        процессы не стартуют, и это не видно до срока.
      - Не заводить свой механизм отложенного запуска через реквизит с датой: у
        библиотеки для этого есть очередь и обработка ошибок старта.
      
      ### 4. Разобрать связи процессов
      
      **Задача:** от задачи дойти до породившего ее процесса и обратно.
      
      **Функции:**
      
      `БизнесПроцессыИЗадачиСервер.БизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт`
      и `БизнесПроцессыИЗадачиСервер.БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт`
      - функции, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `БизнесПроцессыИЗадачиСервер.ДатаЗавершенияБизнесПроцесса(БизнесПроцессСсылка) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Ведущая задача и главная задача это РАЗНЫЕ связи, и функции для них разные.
        Имена похожи, смысл отличается.
      - Параметр `ДляИзменения` ставит блокировку. Без нужды его не включают: лишние
        блокировки на маршруте дают взаимные ожидания.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check БизнесПроцессыИЗадачиСервер.ВыполнитьЗадачу
      ```
      
    • configuration-update.md 5.6 KB
      # Обновление конфигурации
      
      Механизм БСП, доставляющий новую версию конфигурации: поиск обновлений на
      сервисе, установка из файла, резервная копия перед установкой, перезапуск.
      
      Не путать с обновлением версии информационной базы: то переносит ДАННЫЕ под новую
      версию и работает после установки. Это доставляет саму версию.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ОбновлениеКонфигурации` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ОбновлениеКонфигурацииКлиент` | программный интерфейс клиента: помощник и перезапуск | тонкий и толстый клиент |
      | остальные из четырех модулей семейства | внутренняя реализация библиотеки | - |
      
      Серверный публичный интерфейс здесь узкий: установка это действие пользователя, и
      почти все живет на клиенте.
      
      ## Сценарии
      
      ### 1. Показать пользователю поиск и установку обновлений
      
      **Задача:** своя команда должна открывать типового помощника обновления.
      
      **Функции:**
      
      `ОбновлениеКонфигурацииКлиент.ПоказатьПоискИУстановкуОбновлений(ПараметрыУстановкиОбновлений = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Тонкий и толстый клиент.
      
      `ОбновлениеКонфигурацииКлиент.ПоддерживаетсяУстановкаОбновлений() Экспорт`
      - функция, тот же регион.
      
      **Пример:**
      
      ```bsl
      &НаКлиенте
      Процедура ПроверитьОбновления(Команда)
      
          Если ОбновлениеКонфигурацииКлиент.ПоддерживаетсяУстановкаОбновлений() Тогда
              ОбновлениеКонфигурацииКлиент.ПоказатьПоискИУстановкуОбновлений();
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Проверять поддержку обязательно: в клиент-серверном варианте и в модели сервиса
        установка обновлений недоступна, и команда должна быть скрыта, а не падать.
      - Не собирать свой помощник установки: библиотека делает резервную копию,
        завершает сеансы и перезапускает программу, и повторить это своим кодом
        безопасно не выйдет.
      
      ### 2. Предложить резервную копию перед установкой
      
      **Задача:** до обновления дать пользователю сделать копию базы.
      
      **Функции:**
      
      `ОбновлениеКонфигурацииКлиент.ПоказатьРезервноеКопирование(ПараметрыРезервногоКопирования, ОписаниеОповещения) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Клиент.
      
      **Нюансы и антипаттерны:**
      
      - Работа асинхронная: результат приходит в оповещение. Продолжать установку в
        коде сразу после вызова нельзя, копия еще не сделана.
      - Резервное копирование это отдельный механизм библиотеки. Здесь только вызов его
        помощника из сценария обновления.
      
      ### 3. Узнать, менялись ли исправления конфигурации
      
      **Задача:** понять, применялись ли к конфигурации патчи, до принятия решения об
      обновлении.
      
      **Функции:**
      
      `ОбновлениеКонфигурации.ИсправленияИзменены(ТолькоПроверка = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Параметр `ТолькоПроверка` со значением `Истина` не меняет состояние, а лишь
        отвечает на вопрос. По умолчанию функция состояние МЕНЯЕТ - это неочевидно из
        имени.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ОбновлениеКонфигурацииКлиент.ПоказатьПоискИУстановкуОбновлений
      ```
      
    • contact-information.md 6.4 KB
      # Контактная информация
      
      Механизм БСП, хранящий адреса, телефоны и почту объектов в отдельном регистре, а
      не реквизитами: у одного контрагента бывает несколько адресов разных видов, и
      структура адреса зависит от страны.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `УправлениеКонтактнойИнформацией` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `УправлениеКонтактнойИнформациейКлиент` | программный интерфейс клиента: ввод и правка на форме, переходы | тонкий и толстый клиент |
      | `УправлениеКонтактнойИнформациейЛокализация` | национальная специфика | сервер |
      
      ## Сценарии
      
      ### 1. Прочитать контактную информацию объекта
      
      **Задача:** взять адрес контрагента для печатной формы или письма.
      
      **Функции:**
      
      `УправлениеКонтактнойИнформацией.ВидыКонтактнойИнформацииОбъекта(ВладелецКонтактнойИнформации, ТипКонтактнойИнформации = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени(Имя) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не читать регистр контактной информации запросом напрямую: значение хранится и
        представлением, и разобранными полями, и правила разбора зависят от вида и
        страны.
      - У объекта бывает несколько значений одного вида. Брать первое попавшееся
        неверно: нужен вид, а при нескольких - явное правило выбора.
      
      ### 2. Записать адрес или телефон из кода
      
      **Задача:** загрузка из внешней системы должна заполнять контакты.
      
      **Функции:**
      
      `УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(СсылкаИлиОбъект, ЗначениеИлиПредставление, ВидКонтактнойИнформации, Дата = Неопределено, Замещать = Истина, РаспознатьАдрес = Истина) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Параметр `Замещать` по умолчанию ИСТИНА: прежнее значение того же вида
        затирается. Для истории адресов его передают явно.
      - `РаспознатьАдрес` включает разбор строки по адресному классификатору. На
        массовой загрузке это заметно по времени, и его отключают осознанно.
      - Не записывать набор записей регистра самостоятельно: тогда не заполнятся
        разобранные поля, и отбор по региону или городу перестанет работать.
      
      ### 3. Вывести контактную информацию на форму
      
      **Задача:** на форме своего справочника показать блок контактов так же, как в
      типовых.
      
      **Функции:**
      
      `УправлениеКонтактнойИнформацией.ВыполнитьОтложеннуюИнициализацию(Форма, Объект, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Элементы блока создаются библиотекой динамически. Обращаться к ним по имени из
        своего кода нельзя: имена генерируемые.
      - Инициализация отложенная: блок появляется не мгновенно, и код, ожидающий
        элементы сразу после вызова, их не найдет.
      
      ### 4. Проверить и разобрать адрес
      
      **Задача:** понять, введен ли адрес по классификатору или произвольной строкой.
      
      **Функции:**
      
      `УправлениеКонтактнойИнформацией.АдресВведенВСвободнойФорме(Знач КонтактнаяИнформация) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Адрес в свободной форме не имеет разобранных полей: отбор по региону его не
        найдет, и в отчетах он выпадает молча.
      - Проверять корректность адреса своим кодом бессмысленно: правила зависят от
        страны и версии классификатора.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию
      ```
      
    • currencies-banks-calendars.md 8.5 KB
      # Валюты, банки, графики и календари
      
      Четыре механизма БСП, объединенные тем, что все они дают справочные данные и
      расчеты по ним: курсы валют, классификатор банков, графики работы организации,
      производственный календарь.
      
      **Имена модулей здесь не совпадают с названиями подсистем** - это главное расхождение
      в теме. Подсистема называется "Валюты", а модуль `РаботаСКурсамиВалют`; подсистема
      "Банки", а модуль `РаботаСБанками`. Модулей `Валюты` и `Банки` в библиотеке НЕТ,
      проверено по обеим поставкам.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `РаботаСКурсамиВалют` | курсы валют: загрузка, пересчет, сумма прописью | сервер, толстый клиент, внешнее соединение |
      | `РаботаСКурсамиВалютЛокализация` | национальная специфика курсов | сервер |
      | `РаботаСБанками` | классификатор банков: поиск по БИК и корсчету | сервер, толстый клиент, внешнее соединение |
      | `РаботаСБанкамиПереопределяемый` | точка расширения классификатора | сервер |
      | `ГрафикиРаботы` | графики работы организации, расчет дат по графику | сервер, толстый клиент, внешнее соединение |
      | `КалендарныеГрафики` | производственный календарь, рабочие даты | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Пересчитать сумму в другую валюту
      
      **Задача:** привести сумму документа к валюте учета на дату документа.
      
      **Функции:**
      
      `РаботаСКурсамиВалют.ПересчитатьВВалюту(Сумма, ИсходнаяВалюта, НоваяВалюта, Дата) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт` - функция, тот
      же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не читать регистр курсов валют запросом и не делить самостоятельно: курс имеет
        кратность, и деление без нее дает неверный результат.
      - Курс берется НА ДАТУ. Пересчет по текущему курсу задним числом искажает
        историю.
      
      ### 2. Сумма прописью
      
      **Задача:** в печатной форме вывести сумму словами с валютой.
      
      **Функции:**
      
      `РаботаСКурсамиВалют.СформироватьСуммуПрописью(СуммаЧислом, Валюта, БезДробнойЧасти = Ложь, Знач КодЯзыка = Неопределено, ДробнаяЧастьПрописью = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не собирать строку платформенным `ЧислоПрописью` со своим шаблоном: параметры
        прописи зависят от валюты и языка, и библиотека берет их из справочника валют.
      
      ### 3. Найти банк по БИК
      
      **Задача:** при вводе реквизитов подставить наименование и корсчет банка.
      
      **Функции:**
      
      Модуль `РаботаСБанками`, регион `ПрограммныйИнтерфейс`. Сервер. Интерфейс узкий -
      два метода: поиск по классификатору и загрузка самого классификатора.
      
      **Нюансы и антипаттерны:**
      
      - Классификатор может быть не загружен. Пустой результат поиска это штатный
        ответ, а не отсутствие банка.
      - Не хранить наименование банка реквизитом рядом с БИК: оно меняется, и
        расхождение всплывет в платежных документах.
      
      ### 4. Рассчитать дату по графику работы
      
      **Задача:** срок исполнения через пять рабочих дней с учетом выходных.
      
      **Функции:**
      
      `ГрафикиРаботы.ДатаПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ГрафикиРаботы.ДатыПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт`
      - функция, тот же регион: несколько сроков сразу.
      
      `ГрафикиРаботы.БлижайшиеДатыВключенныеВГрафик(ГрафикРаботы, НачальныеДаты, ПараметрыПолучения = Неопределено) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Для нескольких дат брать множественную функцию: одиночная в цикле читает график
        на каждый вызов.
      - График может быть не заполнен на нужный период. Параметр `ВызыватьИсключение`
        решает, будет это ошибкой или пустым ответом - выбирать осознанно.
      
      ### 5. Рабочие даты по производственному календарю
      
      **Задача:** то же, но по государственному календарю, а не по графику
      организации.
      
      **Функции:**
      
      `КалендарныеГрафики.ДатаПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `КалендарныеГрафики.БлижайшиеРабочиеДаты(ПроизводственныйКалендарь, НачальныеДаты, ПараметрыПолучения = Неопределено) Экспорт`
      - функция, тот же регион.
      
      `КалендарныеГрафики.ОсновнойПроизводственныйКалендарь() Экспорт` - функция, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - График работы и производственный календарь это РАЗНЫЕ механизмы с похожими
        функциями. График принадлежит организации, календарь государственный.
      - Календарь заполняется на год вперед. Расчет за его пределами даст исключение
        либо пустоту в зависимости от параметра.
      
      ## Различия версий
      
      Состав модулей всех четырех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check РаботаСКурсамиВалют.ПересчитатьВВалюту
      ```
      
    • data-exchange.md 7.7 KB
      # Обмен данными
      
      Механизм БСП, синхронизирующий данные между информационными базами: настройки
      узлов и подключений, запуск и мониторинг обмена, регистрация изменений,
      универсальный формат обмена.
      
      Самая крупная тема библиотеки: 79 разделов документации и 291 метод в основном
      модуле. Здесь только точки входа прикладного кода, а не устройство механизма
      целиком.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ОбменДаннымиСервер` | программный интерфейс сервера, 291 метод | сервер, толстый клиент, внешнее соединение |
      | `ОбменДаннымиXDTOСервер` | универсальный формат обмена: отправка, получение, правила конвертации | сервер, толстый клиент, внешнее соединение |
      | `ОбменДаннымиКлиент` | клиентская часть: помощники настройки и мониторинг | тонкий и толстый клиент |
      | `Обработка.УниверсальныйОбменДаннымиXML` (модуль объекта) | обмен по правилам конвертации | сервер |
      
      **Часть интерфейса объявлена НЕ в общих модулях.** Универсальный обмен и
      конвертация объектов опубликованы модулями объектов обработок. Проверка вызова
      для них работает иначе: в коде обращение идет к переменной с подключенным
      объектом, и автоматически сверить его нельзя - сигнатура сверяется с модулем
      объекта вручную.
      
      ## Сценарии
      
      ### 1. Запустить обмен из кода
      
      **Задача:** синхронизация по расписанию или по действию пользователя.
      
      **Функции:**
      
      `ОбменДаннымиСервер.ВыполнитьДействиеОбмена(Отказ, УзелИнформационнойБазы, ДействиеПриОбмене, ИдентификаторТранспорта = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбменДаннымиСервер.ВыполнитьОбменДаннымиСВнешнейСистемой(Корреспондент, ПараметрыОбмена, ФлагОшибка) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не собирать сообщение обмена платформенными средствами мимо библиотеки: тогда
        не отработают регистрация изменений, протокол и разбор конфликтов.
      - Параметр `Отказ` передается по ссылке. Проверять его после вызова обязательно:
        обмен завершается без исключения и при ошибке.
      - Обмен долгий. Запуск из формы делается фоновым заданием, а не синхронно.
      
      ### 2. Прочитать настройку плана обмена
      
      **Задача:** узнать, что поддерживает конкретный обмен, до его запуска.
      
      **Функции:**
      
      `ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, ИмяПараметра, ИдентификаторНастройки = "", ВерсияКорреспондента = "") Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Настройки зависят от ВЕРСИИ корреспондента: одна и та же настройка у баз разных
        версий отличается. Параметр версии не декоративный.
      
      ### 3. Завершить настройку синхронизации
      
      **Задача:** после создания узла обмена из кода довести настройку до рабочего
      состояния.
      
      **Функции:**
      
      `ОбменДаннымиСервер.ЗавершитьНастройкуСинхронизацииДанных(УзелОбмена) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбменДаннымиСервер.ЗавершитьСозданиеНачальногоОбраза(УзелОбмена) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Создание узла записью объекта плана обмена НЕ завершает настройку: без этих
        вызовов обмен будет числиться настроенным и не работать.
      - Начальный образ создается один раз. Повторный вызов на рабочем узле сбросит
        состояние регистрации изменений.
      
      ### 4. Управлять регистрацией изменений
      
      **Задача:** перерегистрировать данные к отправке после исправления.
      
      **Механизм:** регистрация изменений ведется планом обмена платформы, но библиотека
      добавляет к ней свои правила и служебные данные. Прикладной код обращается к
      методам `ОбменДаннымиСервер`, а не к платформенному плану обмена напрямую.
      
      **Нюансы и антипаттерны:**
      
      - Прямая запись в план обмена платформы обходит служебные регистры библиотеки:
        обмен отправит данные, но состояние синхронизации разъедется.
      - Массовая перерегистрация тяжелая. Ее делают фоново и порциями.
      
      ## Различия версий
      
      **Обработки `УниверсальныйОбменДаннымиXML` в дистрибутиве 3.2.1 уже нет** - это
      записано и в справочнике `1c-bsp-api`. Код, обращающийся к ней, при переходе на
      3.2.1 перестанет работать; обмен переводится на универсальный формат
      `ОбменДаннымиXDTOСервер`.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ОбменДаннымиСервер.ВыполнитьДействиеОбмена
      ```
      
      Для интерфейса, объявленного модулями объектов обработок, автоматическая проверка
      недоступна: сигнатура сверяется с модулем объекта в поставке вручную.
      
    • digital-signature.md 6 KB
      # Электронная подпись
      
      Механизм БСП, подписывающий объекты и файлы криптографической подписью:
      сертификаты, интерактивное подписание, проверка подписи, штампы в печатных формах,
      работа через облачный сервис подписи.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ЭлектроннаяПодпись` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ЭлектроннаяПодписьКлиент` | программный интерфейс клиента: интерактивное подписание и проверка, установка расширения криптографии | тонкий и толстый клиент |
      | `ЭлектроннаяПодписьКлиентЛокализация` | национальная специфика клиента, 74 метода | тонкий и толстый клиент |
      | `ЭлектроннаяПодписьПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      
      **Подписание интерактивное по природе.** Закрытый ключ находится у пользователя,
      поэтому подписать объект серверным кодом без участия клиента нельзя. Серверные
      методы работают с УЖЕ полученной подписью.
      
      ## Сценарии
      
      ### 1. Добавить подпись к объекту
      
      **Задача:** сохранить полученную от пользователя подпись рядом с документом.
      
      **Функции:**
      
      `ЭлектроннаяПодпись.ДобавитьПодпись(Объект, Знач СвойстваПодписи, ИдентификаторФормы = Неопределено, ВерсияОбъекта = Неопределено, ЗаписанныйОбъект = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Свойства подписи собирает КЛИЕНТ через `ЭлектроннаяПодписьКлиент`: закрытый ключ
        на сервер не передается.
      - Версия объекта не декоративна: подпись относится к конкретному состоянию данных,
        и после правки объекта она перестает быть действительной.
      
      ### 2. Прочитать сведения о подписи
      
      **Задача:** показать в интерфейсе, кто и когда подписал.
      
      **Функции:**
      
      `ЭлектроннаяПодпись.ДатаПодписания(Подпись, ПривестиКЧасовомуПоясуСеанса = Истина) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Дата подписания берется ИЗ ПОДПИСИ, а не из момента записи объекта. Это разные
        моменты, и расхождение между ними нормально.
      - Приведение к часовому поясу сеанса включено по умолчанию. При сравнении подписей
        из разных баз его отключают.
      
      ### 3. Поставить штамп подписи в печатную форму
      
      **Задача:** в печатной накладной показать отметку о подписании.
      
      **Функции:**
      
      `ЭлектроннаяПодпись.ДобавитьШтампыВТабличныйДокумент(Документ, ОписаниеШтампов, Размеры = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Штамп рисуется в уже сформированный табличный документ. Место под него в макете
        предусматривается заранее, иначе штамп наложится на текст.
      
      ### 4. Записать сертификат в справочник
      
      **Задача:** зарегистрировать сертификат пользователя для дальнейшего подписания.
      
      **Функции:**
      
      `ЭлектроннаяПодпись.ЗаписатьСертификатВСправочник(Знач Сертификат, ДополнительныеПараметры = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Сертификат читается на клиенте через криптографию и передается на сервер уже
        разобранным. Читать хранилище сертификатов серверным кодом нельзя: его там нет.
      - Не создавать элемент справочника сертификатов записью объекта: библиотека
        разбирает отпечаток, срок действия и владельца.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ЭлектроннаяПодпись.ДобавитьПодпись
      ```
      
    • document-workflow-extras.md 7.4 KB
      # Оригиналы документов, склонение, конструктор формул
      
      Три механизма БСП, дополняющих работу с документами и формами: отметки о
      состоянии бумажных оригиналов, склонение наименований по падежам для печатных
      форм, конструктор выражений над данными объекта.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `УчетОригиналовПервичныхДокументов` | состояния оригиналов и их отражение в списках | сервер, толстый клиент, внешнее соединение |
      | `СклонениеПредставленийОбъектов` | склонение наименований и ФИО по падежам | сервер, толстый клиент, внешнее соединение |
      | `КонструкторФормул` | сбор доступных полей, проверка и вычисление формулы | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Показать состояние оригинала в списке документов
      
      **Задача:** в форме списка отметить, у каких документов бумажный оригинал уже
      получен.
      
      **Функции:**
      
      `УчетОригиналовПервичныхДокументов.ВывестиНаФормуКомандыСостоянияОригинала(Форма, Список, СостоянияОригиналов) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УчетОригиналовПервичныхДокументов.ВсеСостояния() Экспорт` - функция, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Не заводить свой реквизит состояния у документа: библиотека хранит состояния
        отдельно и меняет их пачкой из списка.
      - Состав состояний настраивается пользователем. Своя логика по фиксированному
        списку разойдется с настройкой.
      
      ### 2. Раздать права на смену состояний
      
      **Задача:** менять состояние оригинала должны не все.
      
      **Функции:**
      
      `УчетОригиналовПервичныхДокументов.ДополнитьПрофильРольюДляИзмененияСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт`
      и `УчетОригиналовПервичныхДокументов.ДополнитьПрофильРольюДляНастройкиСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. Сервер. Вызываются из описания
      поставляемого профиля групп доступа.
      
      **Нюансы и антипаттерны:**
      
      - Изменение состояния и НАСТРОЙКА состояний это разные права, и процедуры для них
        разные. Выдать одну вместо другой значит либо не дать работать, либо пустить
        пользователя менять справочник состояний.
      
      ### 3. Просклонять наименование для печатной формы
      
      **Задача:** в доверенности вывести ФИО в родительном падеже.
      
      **Функции:**
      
      `СклонениеПредставленийОбъектов.ДоступенСервисСклонения() Экспорт` - функция,
      регион `ПрограммныйИнтерфейс`. Сервер.
      
      `СклонениеПредставленийОбъектов.ПодключитьИсточникДанныхПечатиСклоненияСтрок(ИсточникиДанныхПечати) Экспорт`
      - процедура, тот же регион.
      
      `СклонениеПредставленийОбъектов.ПриСозданииНаСервере(Форма, Представление, ИмяОсновногоРеквизитаФормы = "Объект") Экспорт`
      и `СклонениеПредставленийОбъектов.ПриЗаписиФормыОбъектаСклонения(Форма, Представление, Объект, ПараметрыСклонения = Неопределено) Экспорт`
      - процедуры, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Склонение опирается на внешний сервис либо компоненту. Проверять доступность
        обязательно: без нее в печатной форме окажется именительный падеж вместо
        нужного, и это не ошибка, а тихая подмена.
      - Просклоненные варианты сохраняются вместе с объектом. Пропуск вызова при записи
        формы оставит их пустыми.
      
      ### 4. Дать пользователю конструктор формул
      
      **Задача:** пользователь настраивает выражение над полями документа.
      
      **Функции:**
      
      `КонструкторФормул.ЗаполнитьСписокДоступныхПолей(Форма, ПараметрыЗаполнения) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `КонструкторФормул.ДобавитьСписокПолейНаФорму(Форма, Параметры) Экспорт`
      - процедура, тот же регион.
      
      `КонструкторФормул.ДеревоПолей() Экспорт` - функция, тот же регион.
      
      `КонструкторФормул.ВыполнитьПоискВСпискеПолей(Форма) Экспорт` - процедура, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Не собирать список полей своим обходом метаданных: библиотека учитывает права
        доступа, и в конструкторе не должно быть полей, которых пользователю видеть
        нельзя.
      - Формулу вычисляет библиотека в безопасном режиме. Выполнять пользовательское
        выражение платформенным `Вычислить` нельзя.
      
      ## Различия версий
      
      Состав модулей всех трех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check КонструкторФормул.ЗаполнитьСписокДоступныхПолей
      ```
      
    • duplicates-and-deletion.md 7.6 KB
      # Поиск дублей и удаление помеченных объектов
      
      Два механизма БСП, работающих с лишними данными: поиск дублей заменяет копии
      элемента на выбранный оригинал, удаление помеченных физически удаляет объекты с
      контролем ссылочной целостности.
      
      Механизмы разные, но идут парой: сначала дубли сводят к оригиналу, затем
      помеченные удаляют.
      
      ## Модули механизмов
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ПоискИУдалениеДублей` | программный интерфейс поиска дублей | сервер, толстый клиент, внешнее соединение |
      | `ПоискИУдалениеДублейПереопределяемый` | точка расширения: свои правила сравнения | сервер, толстый клиент, внешнее соединение |
      | `ПоискИУдалениеДублейКлиент` | клиентская часть | тонкий и толстый клиент |
      | `УдалениеПомеченныхОбъектов` | программный интерфейс удаления | сервер, толстый клиент, внешнее соединение |
      | `УдалениеПомеченныхОбъектовКлиент` | клиентская часть, 11 методов | тонкий и толстый клиент |
      | `УдалениеПомеченныхОбъектовПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Найти дубли элемента
      
      **Задача:** перед созданием контрагента проверить, нет ли уже такого.
      
      **Функции:**
      
      `ПоискИУдалениеДублей.НайтиДублиЭлемента(Знач ОбластьПоиска, Знач ЭталонныйОбъект, Знач ДополнительныеПараметры) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ПоискИУдалениеДублей.НайтиПохожиеСтроки(ИсходнаяСтрока, СтрокаПоиска, Разделитель = "~", ПараметрыПоиска = Неопределено) Экспорт`
      - функция, тот же регион: нечеткое сравнение строк.
      
      `ПоискИУдалениеДублей.ПараметрыПоискаПохожихСтрок(ПодключитьКомпоненту = Истина) Экспорт`
      - функция-конструктор, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Нечеткое сравнение строк опирается на внешнюю компоненту. Параметр
        `ПодключитьКомпоненту` не декоративный: без нее сравнение работает грубее.
      - Поиск дублей по всей области тяжелый. В интерактивном сценарии ищут по
        конкретному эталону, а не сканируют справочник целиком.
      
      ### 2. Заменить дубли на оригинал
      
      **Задача:** свести найденные копии к одному элементу, не потеряв ссылки.
      
      **Функции:**
      
      `ПоискИУдалениеДублей.ДополнитьДублиСвязаннымиПодчиненнымиОбъектами(ПарыЗамен, ПараметрыЗамены) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Замена ссылок это отдельная операция библиотеки, и делать ее своим кодом
        опасно: ссылки на дубль бывают в реквизитах, движениях, регистрах сведений и
        подчиненных объектах.
      - Подчиненные объекты дубля должны переехать к оригиналу. Пропуск этого шага
        оставляет их висеть на удаляемом элементе.
      
      ### 3. Удалить помеченные объекты
      
      **Задача:** служебная обработка должна чистить помеченное по расписанию.
      
      **Функции:**
      
      `УдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(УдаляемыеОбъекты, РежимУдаления = "Стандартный") Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УдалениеПомеченныхОбъектов.ПомеченныеНаУдаление(Знач ОтборМетаданных = Неопределено, ИскатьТехнологическиеОбъекты = Ложь) Экспорт`
      - функция, тот же регион.
      
      `УдалениеПомеченныхОбъектов.РежимУдалятьПоРасписанию() Экспорт` - функция, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Не удалять объект платформенным `Удалить` в обход: контроль ссылочной
        целостности при этом не выполняется, и в базе останутся битые ссылки.
      - Результат удаления частичный: часть объектов не удалится из-за ссылок на них.
        Это штатный ответ, и его надо разобрать, а не считать ошибкой.
      
      ### 4. Показать, что мешает удалению
      
      **Задача:** объяснить пользователю, почему объект не удаляется.
      
      **Функции:**
      
      `УдалениеПомеченныхОбъектов.СсылкиНаУдаляемыеОбъекты(Источник) Экспорт` - функция,
      регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УдалениеПомеченныхОбъектов.ПриСозданииНаСервере(Форма, Знач НастройкиОтображенияПомеченныхОбъектов) Экспорт`
      - процедура, тот же регион: встраивание в форму.
      
      `УдалениеПомеченныхОбъектов.НастройкиОтображенияПомеченныхОбъектов() Экспорт`
      - функция-конструктор, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Искать ссылки платформенным поиском по всей базе долго. Функция библиотеки
        учитывает исключения и служебные объекты.
      
      ## Различия версий
      
      Состав модулей обоих механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check УдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты
      ```
      
    • email.md 5.5 KB
      # Работа с почтовыми сообщениями
      
      Механизм БСП, отправляющий и загружающий электронную почту через учетные записи,
      настроенные пользователем: письма из кода, вложения, загрузка входящих, защита от
      небезопасного содержимого.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `РаботаСПочтовымиСообщениями` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `РаботаСПочтовымиСообщениямиКлиент` | программный интерфейс клиента: формы отправки | тонкий и толстый клиент |
      | `РаботаСПочтовымиСообщениямиЛокализация` | национальная специфика | сервер |
      
      ## Сценарии
      
      ### 1. Отправить письмо из кода
      
      **Задача:** уведомить пользователя о результате обработки.
      
      **Функции:**
      
      `РаботаСПочтовымиСообщениями.ОтправитьПисьма(УчетнаяЗаписьИлиСоединение, Письма, ТекстОшибки = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `РаботаСПочтовымиСообщениями.ДоступныеУчетныеЗаписи(Знач ДляОтправки = Неопределено, Знач ДляПолучения = Неопределено, Знач ВключатьСистемнуюУчетнуюЗапись = Истина) Экспорт`
      - функция, тот же регион.
      
      `РаботаСПочтовымиСообщениями.ДоступнаОтправкаПисем() Экспорт` - функция, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Проверять `ДоступнаОтправкаПисем` до сборки письма: без настроенной учетной
        записи отправка не состоится, и собранное письмо пропадет впустую.
      - Не создавать `Новый ИнтернетПочтовоеСообщение` и не отправлять его платформенным
        профилем напрямую: тогда не отработают настройки учетной записи, журнал и
        ограничения администратора.
      - Отправка нескольких писем идет ОДНИМ вызовом со списком: соединение
        устанавливается один раз, а не на каждое письмо.
      
      ### 2. Загрузить входящие письма
      
      **Задача:** обработать почту робота: заявки, накладные, ответы.
      
      **Функции:**
      
      `РаботаСПочтовымиСообщениями.ЗагрузитьПочтовыеСообщения(Знач УчетнаяЗаписьИлиСоединение, Знач ПараметрыЗагрузки = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Загрузка долгая и сетевая. Ее место - регламентное задание, а не обработчик
        формы.
      - Учетная запись должна быть настроена НА ПОЛУЧЕНИЕ. Запись только для отправки
        вернет пустой результат без ошибки.
      
      ### 3. Обезопасить письмо в формате HTML
      
      **Задача:** показать пользователю входящее письмо, не подгружая внешние картинки
      и скрипты.
      
      **Функции:**
      
      `РаботаСПочтовымиСообщениями.ОтключитьНебезопасноеСодержимое(ДокументHTML, ОтключитьВнешниеРесурсы = Истина) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `РаботаСПочтовымиСообщениями.ЕстьВнешниеРесурсы(ДокументHTML) Экспорт` - функция,
      тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Показывать входящий HTML без этой обработки нельзя: внешние ресурсы письма
        сообщают отправителю о прочтении и подгружают чужой код.
      - Функция проверки нужна, чтобы спросить пользователя: показывать ли картинки.
        Молчаливое отключение выглядит как испорченное письмо.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check РаботаСПочтовымиСообщениями.ОтправитьПисьма
      ```
      
    • extension-points.md 7.7 KB
      # Точки расширения без своего интерфейса
      
      Пять механизмов БСП, у которых прикладному коду доступна ТОЛЬКО точка расширения:
      интерфейс OData, информация при запуске, отчет о движениях документа, проверка
      легальности обновления, а также ручной порядок элементов в списках.
      
      Общее у них: механизм работает сам, а конфигурация лишь объявляет свое участие в
      нем. Вызывать эти модули из прикладного кода не нужно и почти всегда неверно.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `ИнтерфейсODataПереопределяемый` | состав публикуемых объектов OData | сервер, толстый клиент, внешнее соединение |
      | `ИнформацияПриЗапускеПереопределяемый` | информационные сообщения при запуске | сервер, толстый клиент, внешнее соединение |
      | `ОтчетОДвиженияхДокументаПереопределяемый` | состав регистров в отчете о движениях | сервер, толстый клиент, внешнее соединение |
      | `ПроверкаЛегальностиПолученияОбновленияКлиент` | проверка легальности обновления, клиентская часть | тонкий и толстый клиент |
      | `НастройкаПорядкаЭлементов` | ручной порядок элементов в списках | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Объявить зависимые таблицы для OData
      
      **Задача:** при публикации объекта через OData вместе с ним должны выгружаться
      связанные таблицы.
      
      **Функции:**
      
      `ИнтерфейсODataПереопределяемый.ПриЗаполненииЗависимыхТаблицДляВыгрузкиЗагрузкиOData(Таблицы) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК. Единственный метод модуля.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать этот хук из прикладного кода: его реализуют.
      - Незаявленная зависимая таблица выгрузится пустой, и внешняя система получит
        неполные данные без ошибки.
      
      ### 2. Показать сообщение при запуске
      
      **Задача:** предупредить пользователей о предстоящих работах.
      
      **Функции:**
      
      `ИнформацияПриЗапускеПереопределяемый.ОпределитьНастройки(Настройки) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК. Единственный метод модуля.
      
      **Нюансы и антипаттерны:**
      
      - Сообщение показывается КАЖДОМУ при запуске. Тяжелый запрос в этом хуке
        замедляет вход всем пользователям.
      - Не выводить сообщение своим кодом при начале работы системы: библиотека
        запоминает, что пользователь его уже видел.
      
      ### 3. Дополнить отчет о движениях документа
      
      **Задача:** в отчете о движениях показать свой регистр.
      
      **Функции:**
      
      `ОтчетОДвиженияхДокументаПереопределяемый.ПриОпределенииРегистровСДвижениями(Документ, РегистрыСДвижениями) Экспорт`,
      `ОтчетОДвиженияхДокументаПереопределяемый.ПриПодготовкеНабораДанных(Документ, НаборыДанных) Экспорт`,
      `ОтчетОДвиженияхДокументаПереопределяемый.ПриРасчетеКоличестваЗаписей(Документ, РассчитанноеКоличество) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. ХУКИ.
      
      **Нюансы и антипаттерны:**
      
      - Хуки вызываются на КАЖДОЕ открытие отчета. Подсчет записей запросом по всей
        таблице делает отчет медленным.
      - Не вызывать процедуры этого модуля из прикладного кода: их реализуют.
      
      ### 4. Ручной порядок элементов в списке
      
      **Задача:** пользователь двигает строки справочника вверх и вниз, и порядок
      сохраняется.
      
      **Функции:**
      
      `НастройкаПорядкаЭлементов.УстановитьЗначениеРеквизитаУпорядочивания(Объект) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `НастройкаПорядкаЭлементов.СброситьЗначениеРеквизитаУпорядочивания(Источник, ОбъектКопирования) Экспорт`
      - процедура, тот же регион: обработчик подписки при копировании.
      
      `НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещения(МетаданныеОбъекта) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Реквизит упорядочивания заполняет библиотека. Своя нумерация разъедется при
        вставке между элементами.
      - Копия элемента НЕ должна наследовать порядок оригинала: для этого и нужна
        процедура сброса, подключаемая подпиской.
      
      ### 5. Проверка легальности обновления
      
      **Задача:** библиотека спрашивает пользователя, легально ли получено обновление.
      
      **Механизм:** модуль `ПроверкаЛегальностиПолученияОбновленияКлиент`, клиентская
      часть. Вызывается сценарием обновления, а не прикладным кодом.
      
      **Нюансы и антипаттерны:**
      
      - Вопрос задается пользователю интерактивно. Ответ на него серверным кодом
        подменять нельзя.
      
      ## Различия версий
      
      Состав модулей всех пяти механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check НастройкаПорядкаЭлементов.УстановитьЗначениеРеквизитаУпорядочивания
      ```
      
    • external-reports-processors.md 7 KB
      # Дополнительные отчеты и обработки
      
      Механизм БСП, подключающий внешние обработки и отчеты без изменения конфигурации:
      пользователь загружает файл, библиотека регистрирует его команды, назначает права
      и размещает на формах объектов.
      
      Через этот механизм подключаются внешние печатные формы и обработки заполнения -
      они не отдельные механизмы, а виды дополнительных обработок.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ДополнительныеОтчетыИОбработки` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ДополнительныеОтчетыИОбработкиКлиент` | программный интерфейс клиента: выполнение команд | тонкий и толстый клиент |
      | `ДополнительныеОтчетыИОбработкиКлиентСервер` | общая часть: имена видов и типов команд | сервер и клиент |
      | `ДополнительныеОтчетыИОбработкиПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      | остальные из пятнадцати модулей семейства | внутренняя реализация и работа в модели сервиса | - |
      
      ## Сценарии
      
      ### 1. Выполнить команду дополнительной обработки
      
      **Задача:** запустить обработку, подключенную пользователем, из своего кода.
      
      **Функции:**
      
      `ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, Форма) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не подключать внешнюю обработку платформенным способом мимо библиотеки: тогда
        не отработают проверки прав, режим безопасности и журнал использования.
      - Команда может отсутствовать: пользователь мог отключить обработку. Пустой
        результат штатный.
      
      ### 2. Получить объект внешней обработки
      
      **Задача:** обратиться к экспортному методу подключенной обработки напрямую.
      
      **Функции:**
      
      `ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер. Возвращает имя подключенной
      обработки.
      
      `ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(Ссылка) Экспорт`
      - функция, тот же регион. Возвращает сам объект.
      
      **Нюансы и антипаттерны:**
      
      - Подключение и получение объекта это РАЗНЫЕ шаги: первый возвращает имя, второй
        объект. Путать их легко.
      - Внешняя обработка выполняется в режиме безопасности, если он включен. Ее код не
        получит доступ к файловой системе и внешним соединениям молча - будет ошибка.
      
      ### 3. Печать по внешнему источнику
      
      **Задача:** внешняя печатная форма должна печататься наравне с типовыми.
      
      **Функции:**
      
      `ДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику(ДополнительнаяОбработкаСсылка, ПараметрыИсточника, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Вызывается библиотекой печати, а не прикладным кодом напрямую: внешние формы
        попадают в общее меню печати через подключаемые команды.
      - Внешняя печатная форма получает те же параметры, что и типовая. Своего порядка
        вызова у нее нет.
      
      ### 4. Прочитать настройки подключенной обработки
      
      **Задача:** узнать, к каким объектам она назначена и какие у нее команды.
      
      **Функции:**
      
      `ДополнительныеОтчетыИОбработки.ЗагрузитьНастройки(Ссылка) Экспорт` - функция,
      регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не читать реквизиты справочника дополнительных обработок запросом: часть
        сведений лежит в хранилище значения и разбирается библиотекой.
      - Настройки берутся из САМОЙ обработки при загрузке файла. Правка справочника их
        не меняет.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      Отдельный модуль работы дополнительных обработок с регламентными заданиями в
      модели сервиса есть в 3.1.11 и отсутствует в 3.2.1.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ДополнительныеОтчетыИОбработки.ВыполнитьКоманду
      ```
      
    • infobase-update.md 12.6 KB
      # Обновление версии информационной базы
      
      Механизм БСП, приводящий ДАННЫЕ в соответствие новой версии конфигурации:
      обработчики обновления, порционная обработка больших объемов, отложенное
      обновление. Работает после того, как платформа обновила структуру базы.
      
      Не путать с обновлением конфигурации: то доставляет новую версию, это переносит
      данные под нее.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ОбновлениеИнформационнойБазы` | программный интерфейс | сервер, толстый клиент, внешнее соединение |
      | `ОбновлениеИнформационнойБазыПереопределяемый` | точка расширения сервера | сервер, толстый клиент, внешнее соединение |
      | `ОбновлениеИнформационнойБазыКлиентПереопределяемый` | точка расширения клиента: что показать до и после перехода | тонкий и толстый клиент |
      | `ОбновлениеИнформационнойБазыБСП`, `ОбновлениеИнформационнойБазыБСД` | обработчики самой библиотеки, не прикладной код | сервер |
      | `ОбновлениеИнформационнойБазыСлужебный` и еще пять | внутренняя реализация библиотеки | - |
      
      **Собственные обработчики объявляются НЕ в переопределяемом модуле.** Каждая
      подсистема заводит у себя процедуру `ПриДобавленииОбработчиковОбновления(Обработчики)`
      и наполняет переданную таблицу - так устроены и обработчики самой библиотеки,
      проверено по ее исходникам. Переопределяемый модуль отвечает за порядок и за
      события вокруг обновления, а не за перечень обработчиков.
      
      ## Сценарии
      
      ### 1. Объявить обработчик обновления
      
      **Задача:** при переходе на новую версию заполнить новый реквизит у существующих
      документов.
      
      **Механизм:** процедура `ПриДобавленииОбработчиковОбновления(Обработчики)` в общем
      модуле своей подсистемы. Библиотека собирает обработчики со всех подсистем и
      выполняет их по версиям.
      
      **Ключевые свойства строки обработчика** (взято из обработчиков библиотеки):
      
      - `Версия` - версия конфигурации, при переходе на которую обработчик выполняется.
      - `Идентификатор` - `УникальныйИдентификатор`, обязателен для отложенных.
      - `Процедура` - полное имя процедуры, которая делает работу.
      - `РежимВыполнения` - когда выполнять: сразу либо `"Отложенно"`.
      - `ПроцедураЗаполненияДанныхОбновления` - что зарегистрировать к обработке, для
        отложенного режима.
      - `ЧитаемыеОбъекты` и `ИзменяемыеОбъекты` - на чем обработчик работает; по ним
        библиотека строит порядок и разводит блокировки.
      
      **Пример:**
      
      ```bsl
      // Общий модуль своей подсистемы.
      Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
      
          Обработчик = Обработчики.Добавить();
          Обработчик.Версия = "1.2.3.4";
          Обработчик.Идентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
          Обработчик.Процедура = "Документы.РасходТовара.ЗаполнитьНовыйРеквизит";
          Обработчик.РежимВыполнения = "Отложенно";
          Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.РасходТовара.ЗарегистрироватьКОбработке";
          Обработчик.ЧитаемыеОбъекты = "Документ.РасходТовара";
          Обработчик.ИзменяемыеОбъекты = "Документ.РасходТовара";
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не менять данные в модуле сеанса или при начале работы системы: обновление
        данных идет один раз по версии, а не при каждом входе.
      - Идентификатор обработчика не переиспользуется: по нему библиотека отличает уже
        выполненный обработчик от нового.
      - Обработчик выполняется ОДИН раз на переход между версиями. Повторный запуск
        требует сброса состояния, а не повторной установки.
      
      ### 2. Обработать большой объем порциями
      
      **Задача:** заполнить реквизит у миллиона документов, не заблокировав базу.
      
      **Функции:**
      
      `ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Очередь, ПолноеИмяОбъекта, ДополнительныеПараметры = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбновлениеИнформационнойБазы.ВыбратьРегистраторыРегистраДляОбработки(Очередь, ПолноеИмяДокумента, ПолноеИмяРегистра, ДополнительныеПараметры = Неопределено) Экспорт`
      - функция, тот же регион.
      
      `ОбновлениеИнформационнойБазы.ВыбратьИзмеренияНезависимогоРегистраСведенийДляОбработки(Очередь, ПолноеИмяОбъекта, ДополнительныеПараметры = Неопределено) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не выбирать все ссылки одним запросом без порций: отложенный обработчик обязан
        завершаться, а не работать часами в одной транзакции.
      - Для каждого вида источника своя функция выборки. Регистр сведений и документ
        обрабатываются по-разному, и общей функции нет.
      
      ### 3. Узнать версию данных и версию конфигурации
      
      **Задача:** ветвление логики по тому, с какой версии идет переход.
      
      **Функции:**
      
      `ОбновлениеИнформационнойБазы.ВерсияИБ(Знач ИдентификаторБиблиотеки) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбновлениеИнформационнойБазы.ВерсииПодсистем() Экспорт` - функция, тот же
      регион: версии всех подсистем и библиотек сразу.
      
      **Нюансы и антипаттерны:**
      
      - Не читать версию из константы или регистра напрямую: у каждой библиотеки в
        конфигурации своя версия, и одной константой они не описываются.
      - Версия ИБ это версия ДАННЫХ, а не версия конфигурации. До выполнения
        обработчиков они различаются, и на этом различии механизм и работает.
      
      ### 4. Выполнить свое действие вокруг обновления
      
      **Задача:** до обновления снять блокировки, после - пересчитать итоги.
      
      **Функции:**
      
      `ОбновлениеИнформационнойБазыПереопределяемый.ПередОбновлениемИнформационнойБазы() Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `ОбновлениеИнформационнойБазыПереопределяемый.ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ, Знач ИтерацииОбновления, ВыводитьОписаниеОбновлений, Знач МонопольныйРежим) Экспорт`
      - процедура, тот же регион и та же роль.
      
      `ОбновлениеИнформационнойБазыПереопределяемый.ПриЗаполненииОбъектовПланируемыхКУдалению(Объекты) Экспорт` [3.1.11]
      - процедура, тот же регион: объявляет объекты, которые будут удалены в следующих
      версиях. **В 3.2.1 этого хука НЕТ** - код, реализующий его, при переходе
      перестанет вызываться, и о том, что объекты планируются к удалению, библиотека
      не узнает.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `ОбновлениеИнформационнойБазыПереопределяемый` из
        прикладного кода: их реализуют.
      - В хуке после обновления известны ОБЕ версии, прежняя и текущая. Ветвиться надо
        по ним, а не по текущей версии конфигурации.
      
      ### 5. Управлять отложенным обновлением
      
      **Задача:** дать пользователям работать, пока данные догоняют новую версию.
      
      **Функции:**
      
      `ОбновлениеИнформационнойБазы.ВключитьОтключитьОтложенноеОбновление(Использование) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(ВыполнятьОтложенныеОбработчики = Ложь) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Отложенный обработчик обязан переносить неполные данные: пользователь работает
        с базой, где часть записей уже обновлена, а часть еще нет.
      - Не считать отложенное обновление завершенным по факту входа в программу: оно
        идет фоново и завершается позже.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ОбновлениеИнформационнойБазы.ВерсияИБ
      ```
      
    • integration-basics.md 7.2 KB
      # Внешние взаимодействия: интернет, SMS, штрихкоды, внешние компоненты
      
      Четыре механизма БСП, обращенных вовне: загрузка файлов по сети через прокси,
      отправка SMS через оператора, формирование штрихкодов и QR-кодов, подключение
      внешних компонент на рабочем месте.
      
      Общее у них одно: все зависят от настроек администратора и от окружения, поэтому
      каждый сценарий начинается с проверки доступности.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `ПолучениеФайловИзИнтернета` | загрузка по HTTP и FTP, прокси, диагностика | сервер, толстый клиент, внешнее соединение |
      | `ОтправкаSMS` | отправка через оператора, статус доставки | сервер, толстый клиент, внешнее соединение |
      | `ГенерацияШтрихкода` | изображения штрихкодов и QR-кодов | сервер, толстый клиент, внешнее соединение |
      | `ВнешниеКомпоненты` | подключение и установка компонент на рабочем месте | сервер / клиент |
      
      ## Сценарии
      
      ### 1. Загрузить файл по сети
      
      **Задача:** скачать классификатор или обновление, не потеряв настройки прокси.
      
      **Функции:**
      
      `ПолучениеФайловИзИнтернета.ПолучитьПрокси(Знач URLИлиПротокол) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере() Экспорт` и
      `ПолучениеФайловИзИнтернета.НастройкиПроксиНаКлиенте() Экспорт` - функции, тот же
      регион.
      
      `ПолучениеФайловИзИнтернета.ДиагностикаСоединения(URL, ЗаписыватьОшибку = Истина, ПроверятьДоставкуПакетов = Истина, ТекстОшибки = "") Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не создавать `Новый HTTPСоединение` без прокси из библиотеки: в сетях с прокси
        запрос уйдет в никуда, а ошибка будет невнятной.
      - Настройки прокси на сервере и на клиенте РАЗНЫЕ. Брать серверные для
        клиентского запроса неверно.
      - Диагностика соединения дает пользователю понятную причину отказа вместо кода
        ошибки платформы. Ее стоит звать в обработчике ошибки, а не только при отладке.
      
      ### 2. Отправить SMS
      
      **Задача:** уведомить клиента о готовности заказа.
      
      **Функции:**
      
      `ОтправкаSMS.ОтправитьSMS(НомераПолучателей, Знач Текст, ИмяОтправителя = Неопределено, ПеревестиВТранслит = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОтправкаSMS.ДоступнаОтправкаSMS() Экспорт` и
      `ОтправкаSMS.НастройкаОтправкиSMSВыполнена() Экспорт` - функции, тот же регион.
      
      `ОтправкаSMS.СтатусДоставки(Знач ИдентификаторСообщения) Экспорт` - функция, тот
      же регион.
      
      **Нюансы и антипаттерны:**
      
      - Проверять доступность до сборки текста: без настроенного оператора отправка не
        состоится.
      - Доставка асинхронная. Возврат функции означает, что сообщение принято
        оператором, а не доставлено; статус спрашивают отдельно и позже.
      - Перевод в транслит меняет текст. Включать его молча нельзя: получатель увидит
        латиницу вместо кириллицы.
      
      ### 3. Сформировать штрихкод
      
      **Задача:** в печатной форме вывести штрихкод или QR-код.
      
      **Функции:**
      
      `ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода) Экспорт` - функция,
      регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода() Экспорт` - функция-конструктор,
      тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Параметры собираются конструктором, а не структурой вручную: состав полей
        меняется между версиями библиотеки.
      - Генерация опирается на внешнюю компоненту. На сервере без нее функция вернет
        пустое изображение, и в печатной форме будет пустое место без ошибки.
      
      ### 4. Подключить внешнюю компоненту
      
      **Задача:** использовать компоненту сканера или криптографии.
      
      **Механизм:** модуль `ВнешниеКомпоненты` и его клиентская часть. Компонента
      устанавливается на рабочем месте пользователя, и установка интерактивная.
      
      **Нюансы и антипаттерны:**
      
      - Не подключать компоненту платформенным способом мимо библиотеки: тогда не
        отработают проверка версии, установка на рабочем месте и понятное сообщение при
        отказе.
      - Установка требует действий пользователя. Серверный код компоненту на клиенте не
        поставит.
      
      ## Различия версий
      
      Состав модулей всех четырех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ПолучениеФайловИзИнтернета.ПолучитьПрокси
      ```
      
    • message-templates.md 4.9 KB
      # Шаблоны сообщений
      
      Механизм БСП, формирующий письма и сообщения по шаблону: пользователь заводит
      текст с подстановками, библиотека заполняет их данными объекта и собирает готовое
      сообщение с вложениями и получателями.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ШаблоныСообщений` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ШаблоныСообщенийКлиентСервер` | общие правила разбора шаблонов | сервер и клиент |
      | `ШаблоныСообщенийПереопределяемый` | точка расширения: свои параметры шаблонов | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Подставить значения в текст шаблона
      
      **Задача:** заполнить заготовку письма данными документа.
      
      **Функции:**
      
      `ШаблоныСообщений.ВставитьПараметрыВСтрокуСогласноТаблицеПараметров(Знач ШаблонСтроки, ВставляемыеЗначения, Знач Префикс = "") Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не собирать текст конкатенацией и `СтрЗаменить`: шаблон заводит пользователь, и
        имена параметров в нем произвольные, а разбор учитывает вложенность и префиксы.
      - Незаполненный параметр остается в тексте как есть. Проверять результат на
        остатки подстановок надо до отправки.
      
      ### 2. Объявить свои параметры шаблона
      
      **Задача:** в шаблоне должны быть доступны поля своего документа.
      
      **Функции:**
      
      `ШаблоныСообщений.ДобавитьПараметрШаблона(ТаблицаПараметров, ИмяПараметра, ОписаниеТипа, ЭтоПредопределенныйПараметр, ПредставлениеПараметра = "") Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ШаблоныСообщений.ЗаполнитьРеквизитыПоСКД(Реквизиты, Предмет, ПараметрыШаблона) Экспорт`
      - процедура, тот же регион: набор параметров берется из схемы компоновки.
      
      **Нюансы и антипаттерны:**
      
      - Представление параметра видит пользователь при вставке. Пустое представление
        оставляет его наедине с техническим именем.
      - Тип параметра не декоративен: по нему библиотека форматирует значение при
        подстановке.
      
      ### 3. Заполнить получателей письма
      
      **Задача:** взять адреса из контактной информации объекта.
      
      **Функции:**
      
      `ШаблоныСообщений.ЗаполнитьПолучателей(ПолучателиПисьма, ПредметСообщения, ИмяРеквизита, ТипКонтактнойИнформации = Неопределено, ВариантОтправки = "Кому") Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Адреса берутся из механизма контактной информации, а не из реквизита строкой.
        Прямое чтение реквизита пропустит объекты с несколькими адресами.
      - Вариант отправки различает основных получателей и копии. По умолчанию все
        попадают в основные.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ШаблоныСообщений.ЗаполнитьПолучателей
      ```
      
    • monitoring-and-search.md 7.2 KB
      # Замеры, мониторинг, полнотекстовый поиск, итоги
      
      Четыре механизма БСП, не участвующих в прикладной логике напрямую, но влияющих
      на нее: замеры производительности ключевых операций, отправка обезличенной
      статистики, полнотекстовый поиск по данным, управление итогами и агрегатами.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `ОценкаПроизводительности`, `ОценкаПроизводительностиКлиент` | замеры ключевых операций | сервер / клиент |
      | `ЦентрМониторинга` | обезличенная статистика использования | сервер, толстый клиент, внешнее соединение |
      | `ПолнотекстовыйПоиск` | обновление индекса и поиск по данным | сервер, толстый клиент, внешнее соединение |
      
      **Модуля `УправлениеИтогамиИАгрегатами` в публичном интерфейсе нет**: механизм
      работает регламентным заданием и настройками, а не вызовами из прикладного кода.
      Проверено по обеим поставкам.
      
      ## Сценарии
      
      ### 1. Замерить свою ключевую операцию
      
      **Задача:** понять, сколько занимает проведение документа у реальных
      пользователей.
      
      **Функции:**
      
      `ОценкаПроизводительности.ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала, ВесЗамера = 1, Комментарий = Неопределено, ВыполненСОшибкой = Ложь) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных, ИмяШага = "", Комментарий = "") Экспорт`
      - процедура, тот же регион.
      
      `ОценкаПроизводительности.ЗакончитьЗамерВремениТехнологический(КлючеваяОперация, ВремяНачала, ВесЗамера = 1, Комментарий = Неопределено) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Вес замера не декоративен: по нему считается средняя длительность операции на
        разном объеме данных. Замер проведения одной строки и тысячи строк с весом
        единица даст бессмысленное среднее.
      - Замер прикладной и технологический идут в разные отчеты. Технологический нужен
        для служебных операций, а не для пользовательских.
      - Замер, не завершенный при ошибке, портит статистику. Параметр `ВыполненСОшибкой`
        для этого и есть.
      
      ### 2. Записать бизнес-статистику
      
      **Задача:** отправлять в центр мониторинга обезличенный факт использования
      механизма.
      
      **Функции:**
      
      `ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики(ИмяОперации, Значение, Комментарий = Неопределено, Разделитель = ".") Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ЦентрМониторинга.ЗаписатьОперациюБизнесСтатистикиСутки(ИмяОперации, КлючУникальности, Значение, Замещать = Ложь) Экспорт`
      - процедура, тот же регион: одна запись в сутки на ключ.
      
      `ЦентрМониторинга.ВключитьПодсистему() Экспорт` - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Статистика ОБЕЗЛИЧЕННАЯ. Класть в имя операции или комментарий данные
        пользователей и контрагентов нельзя: они уйдут наружу.
      - Суточная запись существует, чтобы не слать одно и то же событие тысячу раз.
        Обычная запись в цикле раздувает отправку.
      
      ### 3. Полнотекстовый поиск по данным
      
      **Задача:** найти объекты по фрагменту текста в любом реквизите.
      
      **Механизм:** модуль `ПолнотекстовыйПоиск`, регион `ПрограммныйИнтерфейс`. Сервер.
      Обновление индекса и выполнение поиска.
      
      **Нюансы и антипаттерны:**
      
      - Поиск работает по ИНДЕКСУ, а не по текущим данным. Только что записанный объект
        находится не сразу: индекс обновляется регламентным заданием.
      - Не подменять полнотекстовый поиск запросом с подобием по всем реквизитам: на
        большой базе он не завершится.
      
      ### 4. Итоги и агрегаты
      
      **Механизм:** настраивается администратором и пересчитывается регламентным
      заданием. Публичного программного интерфейса у механизма нет.
      
      **Нюансы и антипаттерны:**
      
      - Не пересчитывать итоги своим кодом при каждом проведении: платформа делает это
        сама, а библиотека управляет расписанием пересчета.
      - Отключенные итоги ускоряют запись и замедляют чтение остатков. Это решение
        администратора, и прикладной код на него полагаться не должен.
      
      ## Различия версий
      
      Состав модулей всех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ОценкаПроизводительности.ЗакончитьЗамерВремени
      ```
      
    • multilanguage.md 5.6 KB
      # Мультиязычность
      
      Механизм БСП, хранящий данные на нескольких языках: наименование справочника на
      русском и английском, подстановка текущего языка в запросы и представления.
      
      Не путать с локализацией интерфейса: та задается языком конфигурации, здесь
      многоязычными становятся сами ДАННЫЕ.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `МультиязычностьСервер` | программный интерфейс сервера, 57 методов | сервер, толстый клиент, внешнее соединение |
      | `МультиязычностьКлиент` | клиентская часть, три метода | тонкий и толстый клиент |
      | `МультиязычностьПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      
      **Модуля `Мультиязычность` без суффикса не существует**: интерфейс лежит в
      `МультиязычностьСервер`.
      
      ## Сценарии
      
      ### 1. Заполнить многоязычный реквизит
      
      **Задача:** при создании элемента справочника заполнить наименование на всех
      языках.
      
      **Функции:**
      
      `МультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, ИмяРеквизита, ИсходнаяСтрока, КодыЯзыков = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не записывать реквизиты вида `НаименованиеЯзык1` напрямую: имена зависят от
        порядкового номера языка в настройках, и они разъезжаются между внедрениями.
      - Пустая строка на дополнительном языке это не ошибка: библиотека подставит
        значение основного языка при выводе.
      
      ### 2. Подставить текущий язык в запрос
      
      **Задача:** отчет должен выводить наименования на языке пользователя.
      
      **Функции:**
      
      `МультиязычностьСервер.ИзменитьПолеЗапросаПодТекущийЯзык(ТекстЗапроса, ИмяПоля) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `МультиязычностьСервер.ИменаРеквизитовСУчетомКодаЯзыка(ИменаРеквизитов, КодЯзыка = "") Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Не собирать имя поля конкатенацией с номером языка: библиотека знает, какой
        язык основной, а какой дополнительный, и учитывает выключенные языки.
      - Подстановка меняет ТЕКСТ запроса. Делать ее надо до создания запроса, а не
        после.
      
      ### 3. Узнать, включены ли дополнительные языки
      
      **Задача:** не показывать поля второго языка, когда он не используется.
      
      **Функции:**
      
      `МультиязычностьСервер.ИспользуетсяДополнительныйЯзык(ПорядковыйНомерЯзыка) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `МультиязычностьСервер.КоличествоДополнительныхЯзыков() Экспорт` - функция, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Проверять по номеру языка, а не по коду: коды задаются администратором и
        различаются между внедрениями.
      
      ### 4. Поддержать многоязычность в своем объекте
      
      **Задача:** свой справочник должен вести себя как типовой.
      
      **Функции:**
      
      `МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект) Экспорт` - процедура,
      регион `ПрограммныйИнтерфейс`. Сервер. Вызывается из обработчика формы.
      
      **Нюансы и антипаттерны:**
      
      - Пропуск вызова перед записью оставляет значения дополнительных языков
        незаполненными, и ошибки при этом нет.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check МультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит
      ```
      
    • object-prefixes.md 11 KB
      # Префиксация объектов
      
      Механизм БСП, подставляющий префикс в номер документа или код справочника при
      записи: префикс информационной базы и префикс организации. Нужен, когда одни и те
      же объекты создаются в нескольких базах или от нескольких организаций и номера не
      должны сталкиваться.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ПрефиксацияОбъектовКлиентСервер` | программный интерфейс: разбор и сборка номера | сервер, тонкий и толстый клиент, внешнее соединение |
      | `ПрефиксацияОбъектовПереопределяемый` | точка расширения: свои правила формирования префикса | сервер, толстый клиент, внешнее соединение |
      | `ПрефиксацияОбъектовКлиентСерверПереопределяемый` | точка расширения: свое правило номера на печать | сервер, тонкий и толстый клиент, внешнее соединение |
      | `ПрефиксацияОбъектовСобытия` | обработчики подписок на события, подставляющие префикс при записи | сервер, толстый клиент, внешнее соединение |
      | `ПрефиксацияОбъектовСлужебный` | внутренняя реализация библиотеки | - |
      | `ПрефиксацияОбъектовПовтИсп` | кэш повторного использования, служебный | - |
      
      **Модуля `ПрефиксацияОбъектов` без суффикса не существует.** Разбор номера лежит в
      `ПрефиксацияОбъектовКлиентСервер`, подстановка префикса при записи - в
      `ПрефиксацияОбъектовСобытия`, а точки расширения - в двух модулях с суффиксом
      `Переопределяемый`.
      
      Модуль `ПрефиксацияОбъектовСобытия` устроен иначе, чем прочие: это не интерфейс
      для вызова, а набор обработчиков, которые подписки на события библиотеки вызывают
      сами. Прикладной код туда не обращается.
      
      ## Сценарии
      
      ### 1. Показать номер пользователю без префиксов
      
      **Задача:** в печатной форме или в отчете вывести номер документа так, как его
      называет человек, без служебных префиксов базы и организации.
      
      **Функции:**
      
      `ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Доступна и на клиенте, и на сервере.
      
      **Параметры:**
      
      - `НомерОбъекта` - `Строка`, номер или код как он лежит в базе.
      - `УдалитьПрефиксИнформационнойБазы` - `Булево`, убрать префикс базы.
      - `УдалитьПользовательскийПрефикс` - `Булево`, убрать префикс, заданный
        пользователем.
      
      **Пример:**
      
      ```bsl
      &НаКлиенте
      Функция НомерДляЗаголовка(Знач Номер)
      
          Возврат ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Номер, Истина, Истина);
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не резать номер строковыми функциями по фиксированной длине: длина префикса
        зависит от настроек базы и организации и меняется между внедрениями.
      - Функция доступна на клиенте, поэтому серверный вызов ради нее не нужен.
      
      ### 2. Разобрать номер на части
      
      **Задача:** получить из номера отдельно пользовательский префикс либо очистить
      номер от лидирующих нулей перед сравнением.
      
      **Функции:**
      
      `ПрефиксацияОбъектовКлиентСервер.ПользовательскийПрефикс(Знач НомерОбъекта) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`.
      
      `ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(Знач НомерОбъекта) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`.
      
      `ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(Знач НомерОбъекта, УдалитьПрефиксОрганизации = Ложь, УдалитьПрефиксИнформационнойБазы = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция НомераСовпадают(Знач Первый, Знач Второй)
      
          Первый = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(
              ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(Первый, Истина, Истина));
          Второй = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(
              ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераОбъекта(Второй, Истина, Истина));
      
          Возврат Первый = Второй;
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Сравнивать номера из разных баз без снятия префиксов бессмысленно: у одного и
        того же документа они разные.
      - `УдалитьПрефиксыИзНомераОбъекта` по умолчанию не убирает ни один из префиксов -
        оба параметра нужно передавать явно.
      
      ### 3. Задать свое правило формирования префикса
      
      **Задача:** префикс организации берется не из типового реквизита, а из своего.
      
      **Функции:**
      
      `ПрефиксацияОбъектовПереопределяемый.ПолучитьПрефиксообразующиеРеквизиты(Объекты) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК: библиотека вызывает его сама.
      
      `ПрефиксацияОбъектовПереопределяемый.ПриИзмененииНомера(Объект, Знач Номер, БазовыйНомер, СтандартнаяОбработка) Экспорт`
      и `ПриИзмененииКода(Объект, Знач Код, БазовыйКод, СтандартнаяОбработка) Экспорт`
      - процедуры, тот же регион и та же роль хука.
      
      **Параметры:**
      
      - `Объекты` - `Соответствие`, куда добавляется объект метаданных и имя реквизита,
        из которого берется префиксообразующее значение.
      - `СтандартнаяОбработка` - `Булево`; сброс в `Ложь` отключает типовое поведение.
      
      **Пример:**
      
      ```bsl
      // Модуль ПрефиксацияОбъектовПереопределяемый, тело хука.
      Процедура ПолучитьПрефиксообразующиеРеквизиты(Объекты) Экспорт
      
          Объекты.Вставить(Метаданные.Документы.РасходТовара, "Подразделение");
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать `ПрефиксацияОбъектовПереопределяемый.ПолучитьПрефиксообразующиеРеквизиты(...)`
        из прикладного кода: это хук, его реализуют.
      - Реквизит, названный в хуке, должен быть у объекта на момент записи. Пустое
        значение даст номер без префикса организации, а не ошибку.
      
      ### 4. Подставить префикс своему объекту
      
      **Задача:** новый документ конфигурации должен получать префикс так же, как
      типовые.
      
      **Механизм:** объект включается в подписки на события библиотеки. Обработчики
      лежат в `ПрефиксацияОбъектовСобытия` и вызываются подписками, а не прикладным
      кодом.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать обработчики `ПрефиксацияОбъектовСобытия` напрямую из модуля объекта:
        они рассчитаны на параметры подписки и порядок вызовов библиотеки.
      - Подписка на событие настраивается в конфигурации; забытая подписка выглядит как
        работающий механизм с номерами без префикса.
      
      ## Различия версий
      
      Состав модулей и их экспортные методы в 3.1.11 и 3.2.1 совпадают - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ПрефиксацияОбъектовКлиентСервер.НомерНаПечать
      ```
      
    • object-versioning.md 9.7 KB
      # Версионирование объектов
      
      Механизм БСП, сохраняющий историю изменений объекта: кто и когда правил, что
      именно изменилось, откат к прежней версии. Включается на объект метаданных, а не
      на конфигурацию целиком.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ВерсионированиеОбъектов` | программный интерфейс: включение, настройка, встраивание в форму | сервер, толстый клиент, внешнее соединение |
      | `ВерсионированиеОбъектовКлиент` | программный интерфейс клиента: открытие отчетов и настройки | тонкий и толстый клиент |
      | `ВерсионированиеОбъектовПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      | `ВерсионированиеОбъектовСобытия` | обработчики подписок, записывающие версию при изменении | сервер, толстый клиент, внешнее соединение |
      | `ВерсионированиеОбъектовСлужебныйВызовСервера` | внутренняя реализация библиотеки | - |
      
      Здесь, в отличие от многих механизмов библиотеки, клиентский модуль публичный:
      `ВерсионированиеОбъектовКлиент` содержит открытие отчета по версии и по
      изменениям. Проверять контекст все равно надо: серверные методы вызывать с
      клиента нельзя.
      
      ## Сценарии
      
      ### 1. Включить версионирование объекта из кода
      
      **Задача:** при внедрении включить хранение истории для своего документа, не
      заставляя администратора искать настройку.
      
      **Функции:**
      
      `ВерсионированиеОбъектов.ВключитьВерсионированиеОбъекта(ИмяОбъекта, Знач ВариантВерсионирования = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ВерсионированиеОбъектов.ВключеноВерсионированиеОбъекта(ИмяОбъекта) Экспорт`
      - функция, тот же регион.
      
      **Параметры:**
      
      - `ИмяОбъекта` - `Строка`, полное имя объекта метаданных.
      - `ВариантВерсионирования` - когда версия пишется: при каждой записи, при
        проведении и так далее.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ВключитьИсториюПоРасходу()
      
          ИмяОбъекта = "Документ.РасходТовара";
          Если Не ВерсионированиеОбъектов.ВключеноВерсионированиеОбъекта(ИмяОбъекта) Тогда
              ВерсионированиеОбъектов.ВключитьВерсионированиеОбъекта(ИмяОбъекта);
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не писать в регистр версий напрямую: формат хранения внутренний и меняется
        между версиями библиотеки.
      - Включение действует на будущие записи. Историю за прошлое оно не восстановит.
      - Для нескольких объектов сразу есть парные методы `ВключитьВерсионированиеОбъектов`
        и `ВключеноВерсионированиеОбъектов`, они принимают список.
      
      ### 2. Встроить историю в форму объекта
      
      **Задача:** на форме документа показать команду перехода к истории изменений.
      
      **Функции:**
      
      `ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма) Экспорт` - процедура, регион
      `ПрограммныйИнтерфейс`. Сервер.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      
          ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтаФорма);
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Вызов идет в обработчике формы `ПриСозданииНаСервере`, а не в
        `ПриОткрытии`: элементы формы к моменту открытия уже должны быть на месте.
      - Имя метода библиотеки совпадает с именем обработчика формы. Это не рекурсия:
        вызывается метод общего модуля, а не сама процедура формы.
      
      ### 3. Открыть историю изменений с клиента
      
      **Задача:** по команде формы показать отчет об изменениях объекта.
      
      **Функции:**
      
      `ВерсионированиеОбъектовКлиент.ОткрытьОтчетПоИзменениям(Ссылка, АдресСериализованногоОбъекта) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Тонкий и толстый клиент.
      
      `ВерсионированиеОбъектовКлиент.ОткрытьОтчетПоВерсииОбъекта(Ссылка, АдресСериализованногоОбъекта) Экспорт`
      - процедура, тот же регион.
      
      **Пример:**
      
      ```bsl
      &НаКлиенте
      Процедура ИсторияИзменений(Команда)
      
          ВерсионированиеОбъектовКлиент.ОткрытьОтчетПоИзменениям(Объект.Ссылка, "");
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать серверный `ВерсионированиеОбъектов` из клиентского обработчика:
        у него контексты сервера, толстого клиента и внешнего соединения, на тонком
        клиенте его нет. Для клиента есть парный модуль с суффиксом `Клиент`.
      - Ссылка на новый, еще не записанный объект истории не имеет: команду для такого
        случая надо гасить.
      
      ### 4. Поправить поведение при восстановлении версии
      
      **Задача:** при откате к прежней версии дозаполнить реквизиты, которых в старой
      версии не было.
      
      **Функции:**
      
      `ВерсионированиеОбъектовПереопределяемый.ПриВосстановленииВерсииОбъекта(Объект, ДополнительныеРеквизиты) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК: библиотека вызывает его сама.
      
      `ВерсионированиеОбъектовПереопределяемый.ПослеРазбораВерсииОбъекта(Ссылка, Результат) Экспорт`
      - процедура, тот же регион и та же роль.
      
      **Пример:**
      
      ```bsl
      // Модуль ВерсионированиеОбъектовПереопределяемый, тело хука.
      Процедура ПриВосстановленииВерсииОбъекта(Объект, ДополнительныеРеквизиты) Экспорт
      
          Если ТипЗнч(Объект) = Тип("ДокументОбъект.РасходТовара")
              И Не ЗначениеЗаполнено(Объект.Ответственный) Тогда
              Объект.Ответственный = Пользователи.ТекущийПользователь();
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать `ВерсионированиеОбъектовПереопределяемый.ПриВосстановленииВерсииОбъекта(...)`
        из прикладного кода: это хук.
      - Не записывать объект внутри хука: запись выполняет библиотека после его вызова,
        и своя запись даст лишнюю версию.
      
      ## Различия версий
      
      Состав модулей и их экспортные методы в 3.1.11 и 3.2.1 совпадают - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ВерсионированиеОбъектов.ВключитьВерсионированиеОбъекта
      ```
      
    • organizations-and-settings.md 4.8 KB
      # Организации и настройки программы
      
      Два механизма БСП, задающих рамку внедрения: сведения об организациях с
      ответственными лицами и обособленными подразделениями, и форма настроек
      программы, куда подсистемы добавляют свои разделы.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `ОрганизацииСервер` | сведения об организациях, ответственные лица, подразделения | сервер, толстый клиент, внешнее соединение |
      | `ОрганизацииПереопределяемый` | точка расширения: свои источники сведений | сервер, толстый клиент, внешнее соединение |
      | `НастройкиПрограммыПереопределяемый` | точка расширения формы настроек | сервер, толстый клиент, внешнее соединение |
      
      **Модуля `Организации` без суффикса не существует**: интерфейс лежит в
      `ОрганизацииСервер`. У настроек программы своего серверного модуля в публичном
      интерфейсе нет вовсе - есть только точка расширения, потому что форма настроек
      принадлежит библиотеке.
      
      ## Сценарии
      
      ### 1. Получить сведения об организации
      
      **Задача:** для печатной формы взять реквизиты и ответственных лиц на дату
      документа.
      
      **Механизм:** модуль `ОрганизацииСервер`, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Ответственные лица меняются со временем. Брать их НА ДАТУ документа, а не
        текущих: иначе перепечатанный старый документ получит нового подписанта.
      - Обособленное подразделение имеет собственные реквизиты. Подставлять реквизиты
        головной организации в его документы неверно.
      
      ### 2. Подключить свой источник сведений
      
      **Задача:** реквизиты организации берутся из своего справочника, а не типового.
      
      **Функции:**
      
      Процедуры модуля `ОрганизацииПереопределяемый` - регион `ПрограммныйИнтерфейс`.
      ХУКИ: библиотека вызывает их сама.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры переопределяемого модуля из прикладного кода: их
        реализуют.
      - Хук должен отдавать сведения на любую запрошенную дату, включая прошлые
        периоды: библиотека спрашивает их при перепечатке старых документов.
      
      ### 3. Добавить свой раздел в настройки программы
      
      **Задача:** настройки своей подсистемы должны быть там же, где типовые.
      
      **Функции:**
      
      Процедуры модуля `НастройкиПрограммыПереопределяемый` - регион
      `ПрограммныйИнтерфейс`. ХУКИ. Каждая отвечает за свою группу настроек: работа с
      файлами, пользователи и права, обслуживание, интернет-поддержка.
      
      **Нюансы и антипаттерны:**
      
      - Не заводить свою форму настроек: тогда пользователь ищет настройки в двух
        местах, а права на них расходятся с типовыми.
      - Хук вызывается при открытии формы настроек. Тяжелая работа в нем откладывает
        открытие.
      
      ## Различия версий
      
      Состав модулей обоих механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py module ОрганизацииСервер
      ```
      
    • period-end-closing.md 9.8 KB
      # Даты запрета изменения
      
      Механизм БСП, запрещающий править данные раньше указанной даты: закрытый период,
      сданная отчетность, зафиксированные остатки. Запрет действует при записи объекта и
      при загрузке данных из обмена.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ДатыЗапретаИзменения` | программный интерфейс: проверка запрета, обработчики подписок | сервер, толстый клиент, внешнее соединение |
      | `ДатыЗапретаИзмененияПереопределяемый` | точка расширения: свои разделы запрета | сервер, толстый клиент, внешнее соединение |
      | `ДатыЗапретаИзмененияСлужебный` и еще три с тем же суффиксом | внутренняя реализация библиотеки | - |
      
      **Модуля `ДатыЗапрета` без слова `Изменения` не существует**, как и модуля
      `ДатыЗапретаИзмененияКлиент`: публичного клиентского интерфейса у механизма нет.
      Клиентские модули семейства служебные, все четыре.
      
      ## Сценарии
      
      ### 1. Проверить запрет перед своей операцией
      
      **Задача:** до записи или до групповой обработки убедиться, что дата попадает в
      разрешенный период, и показать понятную причину отказа.
      
      **Функции:**
      
      `ДатыЗапретаИзменения.ИзменениеЗапрещено(ДанныеИлиПолноеИмя, ИдентификаторДанных = Неопределено, ОписаниеОшибки = Null, УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ДатыЗапретаИзменения.НайденЗапретИзмененияДанных(Знач ДанныеДляПроверки, ПараметрыСообщенияОЗапрете = Неопределено, ОписаниеОшибки = Null, УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт`
      - функция, тот же регион. Отличается тем, что сама сообщает пользователю по
      переданным параметрам сообщения.
      
      `ДатыЗапретаИзменения.ПараметрыСообщенияОЗапрете() Экспорт` - функция-конструктор
      структуры параметров, тот же регион.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция ПериодОткрыт(Знач Ссылка)
      
          ОписаниеОшибки = "";
          Возврат Не ДатыЗапретаИзменения.ИзменениеЗапрещено(Ссылка, , ОписаниеОшибки);
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не сравнивать дату документа с константой даты запрета самостоятельно: запрет
        бывает разным по разделам, по организациям и по видам объектов, и одна дата все
        эти случаи не описывает.
      - Параметр `ОписаниеОшибки` передается по ссылке и заполняется библиотекой -
        объявлять переменную нужно до вызова.
      
      ### 2. Подключить проверку к своему объекту
      
      **Задача:** свой документ должен подчиняться датам запрета так же, как типовые.
      
      **Механизм:** обработчики подписок на события. Они лежат в самом
      `ДатыЗапретаИзменения` и вызываются подписками, а не прикладным кодом.
      
      **Функции (обработчики подписок):**
      
      `ПроверитьДатуЗапретаИзмененияПередЗаписью(Источник, Отказ) Экспорт`,
      `ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт`,
      `ПроверитьДатуЗапретаИзмененияПередЗаписьюНабораЗаписей(Источник, Отказ, Замещение) Экспорт`,
      `ПроверитьДатуЗапретаИзмененияПередУдалением(Источник, Отказ) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. Для регистров бухгалтерии и расчета
      есть отдельные обработчики с другой сигнатурой.
      
      **Нюансы и антипаттерны:**
      
      - Обработчик подбирается ПО ВИДУ объекта: у документа, у набора записей и у
        регистра расчета сигнатуры разные, и подписка с чужим обработчиком не
        скомпилируется.
      - Не звать эти процедуры из модуля объекта напрямую: они рассчитаны на параметры
        подписки.
      - Забытая подписка выглядит как работающий механизм: запрет просто не действует, и
        ошибки при этом нет.
      
      ### 3. Отключить проверку на время служебной операции
      
      **Задача:** миграция или исправление данных должны пройти мимо запрета.
      
      **Функции:**
      
      `ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Отключить) Экспорт` - процедура,
      регион `ПрограммныйИнтерфейс`.
      
      `ДатыЗапретаИзменения.ПроверкаДатЗапретаОтключена() Экспорт` - функция, тот же
      регион.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ИсправитьДанныеЗакрытогоПериода()
      
          ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Истина);
          Попытка
              // служебная правка
              ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Ложь);
          Исключение
              ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Ложь);
              ВызватьИсключение;
          КонецПопытки;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Включать проверку обратно обязательно, в том числе при исключении: отключение
        действует на сеанс, и забытый флаг снимает запрет для всей дальнейшей работы
        пользователя.
      - Не оставлять отключение в коде, который выполняется по действию пользователя:
        это обход контроля, а не решение задачи.
      
      ### 4. Завести свой раздел запрета
      
      **Задача:** запрет нужен не по организации, а по своему измерению - например по
      складу.
      
      **Функции:**
      
      `ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК: библиотека вызывает его сама.
      
      `ДатыЗапретаИзмененияПереопределяемый.ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения(ИсточникиДанных) Экспорт`
      - процедура, тот же регион и та же роль: объявляет, откуда брать дату для проверки.
      
      Имя первого хука длиннее, чем кажется: короткого `ПриЗаполненииРазделовДатЗапрета`
      в библиотеке НЕТ, слово `Изменения` в конце обязательно.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `ДатыЗапретаИзмененияПереопределяемый` из прикладного
        кода: их реализуют.
      - Раздел, объявленный в хуке, должен иметь настройку в интерфейсе, иначе
        пользователь не сможет задать по нему дату.
      
      ## Различия версий
      
      Состав модулей и их экспортные методы в 3.1.11 и 3.2.1 совпадают - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ДатыЗапретаИзменения.ИзменениеЗапрещено
      ```
      
    • personal-data.md 5.8 KB
      # Защита персональных данных
      
      Механизм БСП, ведущий учет доступа к персональным данным и их уничтожение: журнал
      событий доступа, согласия субъектов, сроки хранения, встраивание отметок в формы
      объектов.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ЗащитаПерсональныхДанных` | программный интерфейс сервера, 75 методов | сервер, толстый клиент, внешнее соединение |
      | `ЗащитаПерсональныхДанныхПереопределяемый` | точка расширения: свои объекты с персональными данными | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Проверить действующее согласие субъекта
      
      **Задача:** до обработки данных убедиться, что согласие получено и не отозвано.
      
      **Функции:**
      
      `ЗащитаПерсональныхДанных.ДействующееСогласиеНаОбработкуПерсональныхДанных(Субъект, Организация = Неопределено, Знач Дата = Неопределено, ИсключаемыйРегистратор = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Согласие привязано к ОРГАНИЗАЦИИ и к дате: действующее у одной организации не
        означает действующего у другой.
      - Отсутствие согласия это штатный ответ, а не ошибка программы: обработка данных в
        этом случае прекращается, а пользователю показывается причина.
      
      ### 2. Рассчитать срок уничтожения данных
      
      **Задача:** узнать, когда персональные данные субъекта подлежат уничтожению.
      
      **Функции:**
      
      `ЗащитаПерсональныхДанных.ДатаУничтоженияДанныхСубъекта(Субъект) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ЗащитаПерсональныхДанных.ДобавитьСубъектыДляРасчетаСроковХранения(Знач Субъекты, Знач ДатаСобытия, ИспользоватьУничтожениеПДн = Неопределено) Экспорт`
      - процедура, тот же регион.
      
      `ЗащитаПерсональныхДанных.ЗаполнитьСубъектыДляРасчетаСроковХраненияПерсональныхДанных() Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Срок считается от ДАТЫ СОБЫТИЯ, а не от даты создания записи. Регистрировать
        событие надо в момент, когда оно произошло.
      - Расчет сроков массовый и идет фоново. Ожидать результата сразу после
        регистрации субъекта нельзя.
      
      ### 3. Добавить печать согласия
      
      **Задача:** у своего объекта должна быть команда печати согласия.
      
      **Функции:**
      
      `ЗащитаПерсональныхДанных.ДобавитьКомандуПечатиСогласияНаОбработкуПерсональныхДанных(КомандыПечати) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер. Вызывается из процедуры
      `ДобавитьКомандыПечати` модуля менеджера объекта.
      
      **Нюансы и антипаттерны:**
      
      - Команда добавляется в общий список команд печати объекта, а не отдельной
        кнопкой: тогда она попадает и в форму списка, и в подменю.
      
      ### 4. Объявить свои объекты с персональными данными
      
      **Задача:** свой справочник содержит персональные данные и должен попадать в
      учет.
      
      **Функции:**
      
      Процедуры модуля `ЗащитаПерсональныхДанныхПереопределяемый` - регион
      `ПрограммныйИнтерфейс`. ХУКИ: библиотека вызывает их сама.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры переопределяемого модуля из прикладного кода: их
        реализуют.
      - Объект, не объявленный в хуке, в учет доступа не попадет, и журнал событий по
        нему будет пуст. Ошибки при этом нет.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ЗащитаПерсональныхДанных.ДатаУничтоженияДанныхСубъекта
      ```
      
    • printing.md 11.5 KB
      # Печать
      
      Механизм БСП, формирующий печатные формы: команды печати в объекте, макеты в
      табличном документе и в форматах офисных документов, предварительный просмотр,
      отправка на принтер и почтой.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `УправлениеПечатью` | программный интерфейс сервера, самый большой модуль механизма | сервер, толстый клиент, внешнее соединение |
      | `УправлениеПечатьюКлиент` | программный интерфейс клиента: выполнение команд, просмотр | тонкий и толстый клиент |
      | `УправлениеПечатьюПереопределяемый` | точка расширения сервера: свои формы и команды, подмена макетов | сервер, толстый клиент, внешнее соединение |
      | `УправлениеПечатьюКлиентПереопределяемый` | точка расширения клиента | тонкий и толстый клиент |
      | `УправлениеПечатьюМультиязычностьПереопределяемый` | многоязычность печатных форм | сервер |
      | `УправлениеПечатьюРФ` | национальная специфика | сервер |
      
      **Команды печати объявляются в модуле МЕНЕДЖЕРА объекта**, процедурой
      `ДобавитьКомандыПечати(КомандыПечати)`, а не в переопределяемом модуле
      подсистемы. Переопределяемый модуль нужен, чтобы вмешаться в уже собранный
      список или в сам процесс печати.
      
      ## Сценарии
      
      ### 1. Объявить команду печати у своего объекта
      
      **Задача:** у документа должна появиться кнопка печати со своей формой.
      
      **Механизм:** процедура `ДобавитьКомандыПечати(КомандыПечати)` в модуле менеджера
      объекта. Библиотека собирает команды со всех объектов формы и строит подменю
      печати.
      
      **Ключевые свойства строки команды:**
      
      - `Идентификатор` - имя макета либо свой идентификатор.
      - `Представление` - что видит пользователь в меню.
      - `Обработчик` - для нетипового поведения; иначе печать идет через менеджер
        печати объекта.
      - `МенеджерПечати` - полное имя объекта, чья процедура `Печать` вызывается.
      
      **Нюансы и антипаттерны:**
      
      - Не добавлять кнопку печати на форму руками: собранная библиотекой команда
        попадает и в форму объекта, и в форму списка, и в подменю рассылки.
      - Идентификатор команды должен совпадать с именем макета, если обработчик не
        задан: библиотека ищет макет по нему.
      
      ### 2. Сформировать печатную форму в коде
      
      **Задача:** в процедуре `Печать` менеджера объекта заполнить табличный документ и
      отдать его библиотеке.
      
      **Функции:**
      
      `УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, ИмяМакета, СинонимМакета, ТабличныйДокумент, Картинка = Неопределено, ПолныйПутьКМакету = "", ИмяФайлаПечатнойФормы = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, ИмяМакета) Экспорт`
      - функция, тот же регион: пользователь мог снять галку с этой формы.
      
      **Пример:**
      
      ```bsl
      // Модуль менеджера документа, процедура Печать.
      Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм,
          ОбъектыПечати, ПараметрыВывода) Экспорт
      
          Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Накладная") Тогда
              УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
                  КоллекцияПечатныхФорм, "Накладная", "Накладная",
                  СформироватьНакладную(МассивОбъектов, ОбъектыПечати));
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не формировать макет, не спросив `НужноПечататьМакет`: пользователь мог снять
        галку, и работа уйдет впустую, а на пакетной печати это заметно.
      - Заполнять `ОбъектыПечати` обязательно: по нему библиотека связывает области
        документа с объектами и печатает их пачкой.
      - Не возвращать табличный документ из процедуры: он кладется в коллекцию, а
        печатью управляет библиотека.
      
      ### 3. Выполнить команду печати с клиента
      
      **Задача:** своя кнопка на форме должна печатать так же, как типовая.
      
      **Функции:**
      
      `УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ВладелецФормы, ПараметрыПечати = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Тонкий и толстый клиент.
      
      `УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати = Неопределено) Экспорт`
      - процедура, тот же регион: минуя предварительный просмотр.
      
      **Пример:**
      
      ```bsl
      &НаКлиенте
      Процедура НапечататьНакладную(Команда)
      
          Объекты = Новый Массив;
          Объекты.Добавить(Объект.Ссылка);
      
          УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
              "Документ.РасходТовара", "Накладная", Объекты, ЭтаФорма);
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не звать серверный `УправлениеПечатью` из клиентского обработчика: у него нет
        контекста тонкого клиента. Печать с клиента идет через модуль с суффиксом
        `Клиент`.
      - Печать на принтер без просмотра не спрашивает пользователя ни о чем. Для
        массовой печати это нужно, для одиночной обычно нет.
      
      ### 4. Вмешаться в состав команд печати
      
      **Задача:** скрыть типовую команду печати при определенных условиях либо
      добавить свою в чужую форму.
      
      **Функции:**
      
      `УправлениеПечатьюПереопределяемый.ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `УправлениеПечатью.ДобавитьУсловиеВидимостиКоманды(КомандаПечати, Реквизит, Значение, Знач МетодСравнения = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`: условие видимости по реквизиту
      объекта, вычисляется библиотекой.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `УправлениеПечатьюПереопределяемый` из прикладного кода:
        их реализуют.
      - Видимость по реквизиту задается через `ДобавитьУсловиеВидимостиКоманды`, а не
        своим кодом в форме: библиотека вычислит его один раз на список объектов, а
        свой код в форме - на каждое открытие.
      
      ### 5. Вмешаться в сам процесс печати
      
      **Задача:** подставить свои параметры вывода или изменить набор форм перед
      отправкой почтой.
      
      **Функции:**
      
      `УправлениеПечатьюПереопределяемый.ПередПечатью(Знач ИдентификаторПечатнойФормы, ОбъектыПечати, ПараметрыПечати) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `УправлениеПечатьюПереопределяемый.ПередОтправкойПоПочте(ПараметрыОтправки, ПараметрыВывода, ОбъектыПечати, ПечатныеФормы) Экспорт`
      - процедура, тот же регион и та же роль.
      
      **Нюансы и антипаттерны:**
      
      - Хуки вызываются на КАЖДУЮ печать. Тяжелая работа в них замедляет каждое
        открытие формы печати.
      - Не подменять здесь содержимое макета: за макет отвечает менеджер печати
        объекта, а эти хуки за параметры процесса.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию
      ```
      
    • report-variants.md 7.2 KB
      # Варианты отчетов
      
      Механизм БСП, размещающий отчеты и их варианты в интерфейсе: какие варианты
      предопределены, в каких разделах они видны, какие команды отчетов появляются на
      формах объектов. Пользовательские варианты хранятся отдельно от предопределенных.
      
      Не путать с системой компоновки данных: там устройство самого отчета, здесь его
      место в программе.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `ВариантыОтчетов` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ВариантыОтчетовКлиент` | программный интерфейс клиента: открытие и настройка варианта | тонкий и толстый клиент |
      | `ВариантыОтчетовКлиентСервер` | общая часть: имена и правила | сервер и клиент |
      | `ВариантыОтчетовПереопределяемый` | точка расширения: свои варианты, разделы, команды | сервер, толстый клиент, внешнее соединение |
      | остальные из девяти модулей семейства | внутренняя реализация библиотеки | - |
      
      ## Сценарии
      
      ### 1. Настроить варианты своего отчета
      
      **Задача:** объявить предопределенные варианты и то, где они показываются.
      
      **Функции:**
      
      `ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, ОтчетМетаданные) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер. Вызывается из модуля
      менеджера самого отчета.
      
      `ВариантыОтчетов.ВариантОтчета(Отчет, КлючВарианта) Экспорт` - функция, тот же
      регион.
      
      `ВариантыОтчетов.КлючиВариантовОтчета(КлючОтчета, Знач Пользователь = Неопределено) Экспорт`
      - функция, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Настройка идет в модуле менеджера ОТЧЕТА, а не в переопределяемом модуле
        подсистемы: там объявляются разделы и общие правила, а не устройство конкретного
        отчета.
      - Ключ варианта должен совпадать с именем варианта схемы компоновки. Расхождение
        дает вариант, который не открывается.
      
      ### 2. Объявить разделы, где виден отчет
      
      **Задача:** отчет должен появиться в нужных разделах командного интерфейса.
      
      **Функции:**
      
      `ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(Разделы) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(Настройки) Экспорт`
      - процедура, тот же регион и та же роль.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `ВариантыОтчетовПереопределяемый` из прикладного кода: их
        реализуют.
      - Раздел, не объявленный в хуке, панель отчетов не получит, и отчеты в нем не
        покажутся. Ошибки при этом нет.
      
      ### 3. Добавить команду отчета на форму объекта
      
      **Задача:** из формы документа открывать отчет с подставленным отбором.
      
      **Функции:**
      
      `ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов(Объекты) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов(КомандыОтчетов, Параметры, СтандартнаяОбработка) Экспорт`
      - процедура, тот же регион и та же роль.
      
      **Нюансы и антипаттерны:**
      
      - Команды отчетов размещаются на форме подключаемыми командами. Своя кнопка
        вместо них лишает отчет отбора по текущему объекту.
      - Хук `ПередДобавлениемКомандОтчетов` вызывается для каждой формы. Тяжелая работа
        в нем замедляет открытие всех форм с командами отчетов.
      
      ### 4. Перенести пользовательские варианты при переименовании
      
      **Задача:** ключ варианта изменился, а сохраненные пользователями настройки
      должны остаться.
      
      **Функции:**
      
      `ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов(Изменения) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК.
      
      `ВариантыОтчетов.ЗагрузитьПользовательские(ПользовательскиеВарианты = Неопределено) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Без регистрации изменения ключа пользовательские варианты теряются молча: они
        остаются в базе, но не привязываются к новому ключу.
      - Регистрация нужна ОДИН раз, на версию, где произошло переименование.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера
      ```
      
    • scheduled-jobs.md 15 KB
      # Регламентные задания
      
      Механизм БСП для заданий по расписанию: объявление собственного задания, поиск,
      включение и выключение, чтение расписания и результата последнего выполнения.
      
      Не путать с длительными операциями. Регламентное задание запускается ПЛАНИРОВЩИКОМ
      по расписанию и работает без пользователя. Длительная операция запускается
      действием пользователя и держит форму ожидания. Механизмы разные, модули разные.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `РегламентныеЗаданияСервер` | программный интерфейс, его и вызывают | сервер, толстый клиент, внешнее соединение |
      | `РегламентныеЗаданияПереопределяемый` | точка расширения: свои задания и расписания | сервер, толстый клиент, внешнее соединение |
      | `РегламентныеЗаданияКлиент` | служебный, в прикладном коде не вызывается | тонкий и толстый клиент |
      | `РегламентныеЗаданияСлужебный` | внутренняя реализация библиотеки | - |
      
      **Модуля `РегламентныеЗадания` без суффикса не существует.** Имя выглядит
      правдоподобно и в коде встречается как выдумка; программный интерфейс лежит
      в `РегламентныеЗаданияСервер`.
      
      **`РегламентныеЗаданияКлиент` объявлен целиком в регионе
      `СлужебныйПрограммныйИнтерфейс`** - проверено по исходнику библиотеки. Клиентского
      публичного интерфейса у механизма нет, и попытка позвать оттуда что-нибудь из
      прикладного кода нарушает границу библиотеки.
      
      ## Сценарии
      
      ### 1. Объявить свое регламентное задание
      
      **Задача:** добавить в конфигурацию задание, которое библиотека покажет в списке
      настройки, а планировщик запустит по расписанию.
      
      **Механизм:** объект метаданных `РегламентноеЗадание` создается в конфигурации, а
      его описание для библиотеки заполняется в переопределяемом обработчике.
      
      **Функции:**
      
      `РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Это ХУК: библиотека вызывает его сама,
      прикладной код только реализует тело. Вызывать по имени модуля нельзя.
      
      **Параметры:**
      
      - `Настройки` - `ТаблицаЗначений`, куда добавляется строка на каждое свое задание.
        Заполняются метаданные задания и, при необходимости, форма настройки и
        зависимости от функциональных опций.
      
      **Пример:**
      
      ```bsl
      // Модуль РегламентныеЗаданияПереопределяемый, тело хука.
      Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт
      
          Настройка = Настройки.Добавить();
          Настройка.МетаданныеЗадания = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать `РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий(...)`
        из прикладного кода. Хук реализуют, а не зовут.
      - Обработчик самого задания пишется в отдельном общем модуле и указывается в
        свойстве `ИмяМетода` объекта метаданных, а не в этом хуке.
      - Второй метод модуля, `ПриОпределенииНастроек`, отвечает за общие настройки
        подсистемы, а не за перечень заданий. Имена похожи, назначение разное.
      
      ### 2. Найти задание по метаданным
      
      **Задача:** получить объект задания, чтобы дальше включить его, выключить или
      прочитать расписание.
      
      **Функции:**
      
      `РегламентныеЗаданияСервер.НайтиЗадания(Отбор) Экспорт` - функция, регион
      `ПрограммныйИнтерфейс`. Сервер, толстый клиент, внешнее соединение.
      
      **Параметры:**
      
      - `Отбор` - `Структура` с полями отбора; чаще всего заполняется `Метаданные`.
      - Возвращает `Массив` из `РегламентноеЗадание` в локальном режиме и
        `ТаблицаЗначений` в модели сервиса - это описано в шапке метода библиотеки.
        Код, рассчитанный только на массив, в модели сервиса сломается.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция НайтиЗаданиеЗагрузкиКурсов()
      
          Отбор = Новый Структура;
          Отбор.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют);
      
          Задания = РегламентныеЗаданияСервер.НайтиЗадания(Отбор);
          Возврат ?(Задания.Количество() > 0, Задания[0], Неопределено);
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не обращаться к `РегламентныеЗадания.НайтиРегламентныеЗадания(...)` платформы
        напрямую: в модели сервиса заданий там нет, они лежат в очереди заданий.
        Функция библиотеки скрывает это различие.
      - Пустой результат - штатный случай, а не ошибка: задание могло быть удалено из
        конфигурации при обновлении.
      
      ### 3. Включить или выключить задание из кода
      
      **Задача:** погасить задание на время миграции данных и вернуть обратно.
      
      **Функции:**
      
      `РегламентныеЗаданияСервер.УстановитьИспользованиеРегламентногоЗадания(Знач Идентификатор, Знач Использование) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`.
      
      `РегламентныеЗаданияСервер.РегламентноеЗаданиеИспользуется(Знач Идентификатор) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`.
      
      **Параметры:**
      
      - `Идентификатор` - метаданные задания, его уникальный идентификатор либо сам
        объект задания.
      - `Использование` - `Булево`.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ОстановитьЗагрузкуНаВремяМиграции()
      
          Задание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют;
          Если РегламентныеЗаданияСервер.РегламентноеЗаданиеИспользуется(Задание) Тогда
              РегламентныеЗаданияСервер.УстановитьИспользованиеРегламентногоЗадания(Задание, Ложь);
          КонецЕсли;
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не менять свойство `Использование` у объекта задания напрямую с последующей
        записью: в модели сервиса это не даст эффекта, а библиотека не узнает об
        изменении.
      - Выключение не прерывает уже запущенное задание. Оно лишь не будет запущено
        снова.
      
      ### 4. Прочитать и изменить расписание
      
      **Задача:** показать пользователю текущее расписание и записать новое.
      
      **Функции:**
      
      `РегламентныеЗаданияСервер.РасписаниеРегламентногоЗадания(Знач Идентификатор, Знач ВСтруктуре = Ложь) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`.
      
      `РегламентныеЗаданияСервер.УстановитьРасписаниеРегламентногоЗадания(Знач Идентификатор, Знач Расписание) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`.
      
      `ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Знач Расписание) Экспорт` и
      `ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(Знач РасписаниеСтруктурой) Экспорт`
      - функции, регион `ПрограммныйИнтерфейс`. Доступны и на клиенте, и на сервере.
      
      **Параметры:**
      
      - `ВСтруктуре` - `Булево`. Истина возвращает расписание структурой, а не объектом
        `РасписаниеРегламентногоЗадания`.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Процедура ПеренестиЗапускНаНочь()
      
          Задание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют;
      
          Расписание = РегламентныеЗаданияСервер.РасписаниеРегламентногоЗадания(Задание);
          Расписание.ВремяНачала = Дата(1, 1, 1, 3, 0, 0);
      
          РегламентныеЗаданияСервер.УстановитьРасписаниеРегламентногоЗадания(Задание, Расписание);
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Объект `РасписаниеРегламентногоЗадания` НЕ сериализуется и на клиент как есть не
        передается. Для передачи между клиентом и сервером его переводят в структуру
        парой `РасписаниеВСтруктуру` и `СтруктураВРасписание`; ключ `ВСтруктуре`
        делает то же самое на чтении.
      - Расписание, полученное функцией, это копия. Правка копии ничего не меняет, пока
        не вызвана `УстановитьРасписаниеРегламентногоЗадания`.
      
      ### 5. Узнать, чем кончилось последнее выполнение
      
      **Задача:** показать в интерфейсе, когда задание отработало и не упало ли.
      
      **Функции:**
      
      `РегламентныеЗаданияСервер.СвойстваПоследнегоЗадания(Знач Задание) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`.
      
      **Пример:**
      
      ```bsl
      &НаСервере
      Функция СостояниеПоследнейЗагрузки()
      
          Задание = Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют;
          Свойства = РегламентныеЗаданияСервер.СвойстваПоследнегоЗадания(Задание);
      
          Если Свойства = Неопределено Тогда
              Возврат "Задание еще ни разу не выполнялось";
          КонецЕсли;
      
          Возврат Свойства.Состояние;
      
      КонецФункции
      ```
      
      **Нюансы и антипаттерны:**
      
      - `Неопределено` при первом обращении - штатный случай, а не ошибка.
      - Не разбирать журнал регистрации ради того же результата: функция библиотеки
        возвращает свойства фонового задания напрямую.
      
      ## Различия версий
      
      - Модуль `ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса` есть в
        библиотеке 3.1.11 и отсутствует в 3.2.1 - проверено по обеим поставкам. Код,
        ссылающийся на него, при переходе на 3.2.1 перестанет компилироваться.
      - Состав `РегламентныеЗаданияСервер` и `РегламентныеЗаданияПереопределяемый` в
        этих версиях совпадает.
      
      ## Проверка перед использованием
      
      Любой вызов из этого справочника проверяется до того, как попадет в код:
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check РегламентныеЗаданияСервер.НайтиЗадания
      ```
      
      Проверка сообщает и об устаревании вызова, а не только о его существовании.
      
    • service-model-and-collaboration.md 6.4 KB
      # Модель сервиса, обсуждения, анкетирование, особые случаи внедрения
      
      Четыре темы, у которых прикладного программного интерфейса почти нет: работа
      библиотеки в модели сервиса, обсуждения через систему взаимодействия,
      анкетирование, а также особенности внедрения подсистем в нетиповых случаях.
      
      Справочник короткий намеренно: там, где интерфейса нет, честнее сказать об этом,
      чем описывать несуществующие вызовы.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `РаботаВМоделиСервисаБСП` | контроль неразделенных данных при записи, два метода | сервер, толстый клиент, внешнее соединение |
      | `Обсуждения` | обсуждения и сообщения через систему взаимодействия | сервер, толстый клиент, внешнее соединение |
      
      **Имя модуля модели сервиса кончается на `БСП`:** `РаботаВМоделиСервисаБСП`, а не
      `РаботаВМоделиСервиса`. Второго в библиотеке нет, проверено по обеим поставкам.
      
      **Публичных модулей у анкетирования и у особых случаев внедрения НЕТ.**
      Анкетирование работает документами и отчетами конфигурации, особые случаи
      внедрения это раздел документации, а не механизм. Проверено по обеим поставкам.
      
      ## Сценарии
      
      ### 1. Проконтролировать разделение данных при записи
      
      **Задача:** в модели сервиса неразделенные данные не должны меняться из области.
      
      **Функции:**
      
      `РаботаВМоделиСервисаБСП.КонтрольНеразделенныхОбъектовПриЗаписи(Источник, Отказ) Экспорт`
      и `РаботаВМоделиСервисаБСП.КонтрольНеразделенныхНаборовЗаписейПриЗаписи(Источник, Отказ, Замещение) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. Сервер. Это обработчики подписок на
      события, а не методы для прямого вызова.
      
      **Нюансы и антипаттерны:**
      
      - Обработчик подбирается ПО ВИДУ объекта: у объекта и у набора записей разные
        сигнатуры, и подписка с чужим обработчиком не скомпилируется.
      - В локальном режиме контроль не срабатывает. Код, работающий и в локальном
        режиме, и в модели сервиса, надо проверять именно в модели сервиса: локально
        ошибка не проявится.
      - Разделенность проверяется функцией `ОбщегоНазначения.РазделениеВключено`, а не
        наличием этих подписок.
      
      ### 2. Проверить доступность обсуждений
      
      **Задача:** показать команду обсуждения только там, где система взаимодействия
      настроена.
      
      **Функции:**
      
      `Обсуждения.ОбсужденияДоступны() Экспорт` - функция, регион
      `ПрограммныйИнтерфейс`. Сервер.
      
      `Обсуждения.ОписаниеВложения(Поток, Наименование) Экспорт` - функция, тот же
      регион.
      
      `Обсуждения.ОбновитьПользователяВСистемеВзаимодействия(Пользователь) Экспорт`
      - процедура, тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Система взаимодействия внешняя. При недоступности сервиса обсуждения не
        работают, и команда должна быть скрыта, а не падать.
      - Пользователь заводится в системе взаимодействия отдельно от пользователя базы.
        Пропуск обновления оставит его без доступа к обсуждениям.
      
      ### 3. Анкетирование
      
      **Механизм:** работает документами, справочниками и отчетами конфигурации.
      Публичных общих модулей у него нет: анкеты создаются и обрабатываются штатными
      объектами, а не вызовами из прикладного кода.
      
      **Нюансы и антипаттерны:**
      
      - Искать модуль `Анкетирование` бесполезно: его нет. Работа идет через объекты
        метаданных подсистемы.
      
      ### 4. Особые случаи внедрения подсистем
      
      **Механизм:** это раздел документации, а не программный механизм. Он описывает,
      что делать при нетиповом внедрении: частичное подключение подсистемы, конфликты
      имен, отказ от части функциональности.
      
      **Нюансы и антипаттерны:**
      
      - Модуля с таким именем нет и быть не может. Раздел читают, а не вызывают.
      
      ## Различия версий
      
      Состав модулей в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check Обсуждения.ОбсужденияДоступны
      ```
      
    • signature-services.md 5.2 KB
      # Сервисы подписи: МЧД, DSS, мобильная подпись
      
      Три механизма БСП вокруг электронной подписи, каждый со своим сервисом:
      машиночитаемые доверенности ФНС, облачная криптография DSS, подписание через
      мобильное устройство.
      
      Основной механизм подписи описан отдельно; здесь только то, что добавляют
      сервисы.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `МашиночитаемыеДоверенности` | доверенности ФНС: формирование, подписание, регистрация, проверка | сервер, толстый клиент, внешнее соединение |
      | `МашиночитаемыеДоверенностиФНСПереопределяемый` | точка расширения МЧД | сервер, толстый клиент, внешнее соединение |
      | `СервисКриптографииDSS` и семейство из шести модулей | облачная криптография DSS | сервер / клиент |
      | `СервисМобильнойПодписи`, `СервисМобильнойПодписиКлиентСервер` | подписание через мобильное устройство | сервер / общий |
      
      **Имя модуля DSS не совпадает с названием подсистемы.** Подсистема называется
      "Электронная подпись сервиса DSS", а модули начинаются с `СервисКриптографииDSS`.
      Модуля `ЭлектроннаяПодписьDSS` в библиотеке НЕТ, проверено по обеим поставкам.
      
      ## Сценарии
      
      ### 1. Проверить доверенность подписанта
      
      **Задача:** до приема подписанного документа убедиться, что доверенность
      действует.
      
      **Механизм:** модуль `МашиночитаемыеДоверенности`, регион `ПрограммныйИнтерфейс`.
      Сервер. Формирование, подписание, регистрация в ФНС и проверка идут через него.
      
      **Нюансы и антипаттерны:**
      
      - Проверка обращается к внешнему сервису ФНС. Она сетевая, долгая и может быть
        недоступна: результат кэшируется библиотекой, а свой код обязан обрабатывать
        отказ сервиса.
      - Доверенность привязана к сертификату подписанта. Действующая доверенность с
        чужим сертификатом документ не подтверждает.
      
      ### 2. Подписать через облачный сервис
      
      **Задача:** у пользователя нет локального сертификата, ключ лежит в облаке.
      
      **Механизм:** семейство `СервисКриптографииDSS`. Клиентская и серверная части
      разделены, подтверждение операции интерактивное.
      
      **Нюансы и антипаттерны:**
      
      - Подписание через DSS все равно требует подтверждения ПОЛЬЗОВАТЕЛЕМ: серверный
        код не подпишет документ молча.
      - Отдельный модуль подтверждения на клиенте существует именно потому, что
        операция асинхронная и с ожиданием ответа сервиса.
      
      ### 3. Подписать с мобильного устройства
      
      **Задача:** руководитель подписывает документ телефоном.
      
      **Механизм:** `СервисМобильнойПодписи` и его общая часть
      `СервисМобильнойПодписиКлиентСервер`.
      
      **Нюансы и антипаттерны:**
      
      - Подпись приходит асинхронно и позже: документ остается неподписанным до ответа
        устройства, и интерфейс должен это показывать.
      - Не считать вызов отправки подписанием: он лишь запрашивает подпись.
      
      ## Различия версий
      
      Состав модулей всех трех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по обеим
      поставкам.
      
      ## Проверка перед использованием
      
      Имена модулей здесь длинные и несовпадающие с названиями подсистем, поэтому
      проверка особенно нужна:
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py modules СервисКриптографииDSS
      ```
      
    • user-workplace.md 6.9 KB
      # Рабочее место пользователя: напоминания, заметки, текущие дела, взаимодействия
      
      Четыре механизма БСП, из которых складывается личное рабочее место: напоминания к
      объектам и датам, личные заметки, начальная страница с текущими делами, история
      писем, звонков и встреч с контактами.
      
      ## Модули
      
      | Модуль | Механизм | Контексты |
      |---|---|---|
      | `НапоминанияПользователя` | напоминания к объектам и датам | сервер, толстый клиент, внешнее соединение |
      | `НапоминанияПользователяКлиент` | показ и откладывание напоминания | тонкий и толстый клиент |
      | `ЗаметкиПользователя` | личные заметки к объектам и разделам | сервер, толстый клиент, внешнее соединение |
      | `ТекущиеДела` | начальная страница: состав дел, счетчики, обновление | сервер, толстый клиент, внешнее соединение |
      | `Взаимодействия` | письма, звонки, встречи, планируемые взаимодействия | сервер, толстый клиент, внешнее соединение |
      
      ## Сценарии
      
      ### 1. Создать и найти напоминание
      
      **Задача:** поставить пользователю напоминание о сроке по документу.
      
      **Функции:**
      
      `НапоминанияПользователя.НайтиНапоминания(Знач Предмет = Неопределено, Идентификатор = Неопределено) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `НапоминанияПользователя.ОбновитьНапоминанияПоПредметам(Предметы) Экспорт`
      - процедура, тот же регион.
      
      `НапоминанияПользователя.ИспользуютсяНапоминанияПользователя() Экспорт` - функция,
      тот же регион.
      
      **Нюансы и антипаттерны:**
      
      - Проверять, включен ли механизм, до создания напоминания: при выключенном оно
        создастся и не покажется.
      - Напоминание привязано к ПРЕДМЕТУ. Обновление по предметам сдвигает сроки пачкой,
        а не заводит новые.
      
      ### 2. Собрать счетчики текущих дел
      
      **Задача:** на начальной странице показать, сколько задач ждет пользователя.
      
      **Механизм:** модуль `ТекущиеДела` и его переопределяемая часть. Своя подсистема
      объявляет дела и считает их количество; библиотека размещает их на начальной
      странице и обновляет.
      
      **Нюансы и антипаттерны:**
      
      - Счетчик считается при КАЖДОМ открытии начальной страницы. Тяжелый запрос там
        замедляет вход в программу всем пользователям.
      - Дело без счетчика показывается без числа. Это допустимо, когда подсчет дорогой.
      
      ### 3. Заполнить реквизиты взаимодействия
      
      **Задача:** создать письмо или звонок из кода с правильным заполнением.
      
      **Функции:**
      
      `Взаимодействия.ЗаполнитьРеквизитыПоУмолчанию(Объект, ДанныеЗаполнения) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `Взаимодействия.ЗаполнитьНаборыЗначенийДоступаПоУмолчанию(Объект, Таблица) Экспорт`
      - процедура, тот же регион.
      
      `Взаимодействия.ИспользуетсяПочтовыйКлиент() Экспорт` и
      `Взаимодействия.ИспользуетсяОтправкаПисемВФорматеHTML() Экспорт` - функции, тот же
      регион.
      
      **Нюансы и антипаттерны:**
      
      - Взаимодействия участвуют в ограничении доступа. Пропуск заполнения наборов
        значений оставит запись видимой не тем, кому следует.
      - Формат письма зависит от настройки. Собирать HTML, не проверив ее, значит
        показать пользователю разметку текстом.
      
      ### 4. Отметить изменение пометки удаления
      
      **Задача:** заметки и связанные данные должны знать, что объект помечен на
      удаление.
      
      **Функции:**
      
      `ЗаметкиПользователя.УстановитьСтатусИзмененияПометкиУдаленияОбъекта(Источник, Отказ) Экспорт`
      и `ЗаметкиПользователя.УстановитьСтатусИзмененияПометкиУдаленияДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт`
      - процедуры, регион `ПрограммныйИнтерфейс`. Сервер. Это обработчики подписок на
      события, а не методы для прямого вызова.
      
      **Нюансы и антипаттерны:**
      
      - Обработчик подбирается ПО ВИДУ объекта: у документа и у прочих объектов разные
        сигнатуры, и подписка с чужим обработчиком не скомпилируется.
      - Не звать их из модуля объекта напрямую: они рассчитаны на параметры подписки.
      
      ## Различия версий
      
      Состав модулей всех четырех механизмов в 3.1.11 и 3.2.1 совпадает - сверено по
      обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check НапоминанияПользователя.НайтиНапоминания
      ```
      
    • users.md 11.1 KB
      # Пользователи
      
      Механизм БСП, связывающий элемент справочника пользователей с учетной записью
      информационной базы: текущий пользователь, полнота прав, внешние пользователи,
      настройки пользователя.
      
      Отвечает на вопрос КТО работает. На вопрос ЧТО ему разрешено видеть отвечает
      управление доступом - другой механизм и другие модули.
      
      ## Модули механизма
      
      | Модуль | Роль | Контексты |
      |---|---|---|
      | `Пользователи` | программный интерфейс сервера | сервер, толстый клиент, внешнее соединение |
      | `ПользователиКлиент` | программный интерфейс клиента, четыре функции | тонкий и толстый клиент |
      | `ПользователиКлиентСервер` | общая часть | сервер и клиент |
      | `ПользователиПереопределяемый` | точка расширения | сервер, толстый клиент, внешнее соединение |
      | `ВнешниеПользователи`, `ВнешниеПользователиКлиент` | контрагенты и партнеры, работающие через отдельный вход | сервер / клиент |
      | `ПользователиСлужебный` и еще восемь с тем же началом | внутренняя реализация библиотеки | - |
      
      Клиентский модуль здесь публичный, но НЕБОЛЬШОЙ: в нем четыре функции о текущем
      пользователе. Все остальное на сервере.
      
      ## Сценарии
      
      ### 1. Получить текущего пользователя
      
      **Задача:** подставить автора в документ, отфильтровать список по пользователю,
      показать имя в заголовке.
      
      **Функции:**
      
      `Пользователи.ТекущийПользователь() Экспорт` - функция, регион
      `ПрограммныйИнтерфейс`. Сервер, толстый клиент, внешнее соединение. Возвращает
      `СправочникСсылка.Пользователи`.
      
      `ПользователиКлиент.ТекущийПользователь() Экспорт` - функция, тот же регион.
      Тонкий и толстый клиент.
      
      `Пользователи.АвторизованныйПользователь() Экспорт` и парная
      `ПользователиКлиент.АвторизованныйПользователь() Экспорт` - функции, тот же
      регион. Отличие от текущего: в сеансе внешнего пользователя возвращается объект
      авторизации, а не элемент справочника пользователей.
      
      **Пример:**
      
      ```bsl
      &НаКлиенте
      Процедура ПриОткрытии(Отказ)
      
          Заголовок = "Работает: " + Строка(ПользователиКлиент.ТекущийПользователь());
      
      КонецПроцедуры
      
      &НаСервере
      Процедура ЗаполнитьАвтора(Объект)
      
          Объект.Автор = Пользователи.ТекущийПользователь();
      
      КонецПроцедуры
      ```
      
      **Нюансы и антипаттерны:**
      
      - Не звать серверный `Пользователи.ТекущийПользователь` из клиентского кода: у
        него контексты сервера, толстого клиента и внешнего соединения, на тонком
        клиенте его нет. Для клиента есть парный модуль с суффиксом `Клиент`.
      - Не подменять его платформенным `ПользователиИнформационнойБазы.ТекущийПользователь`:
        тот возвращает учетную запись базы, а не элемент справочника, и связь между
        ними держит библиотека.
      - **Свойства `Пользователи.СсылкаТекущегоПользователя` не существует.** Имя
        выглядит правдоподобно и встречается как выдумка; нужна функция
        `ТекущийПользователь`.
      
      ### 2. Проверить полноту прав
      
      **Задача:** показать администратору то, что не показывают остальным.
      
      **Функции:**
      
      `Пользователи.ЭтоПолноправныйПользователь(Пользователь = Неопределено, ПроверятьПраваАдминистрированияСистемы = Ложь, СчитатьПолноправнымПользователемВФайловойИБ = Истина) Экспорт`
      - функция, регион `ПрограммныйИнтерфейс`. Сервер.
      
      `ПользователиКлиент.ЭтоПолноправныйПользователь(ПроверятьПраваАдминистрированияСистемы = Ложь) Экспорт`
      - функция, тот же регион. Клиент.
      
      **Нюансы и антипаттерны:**
      
      - Не проверять полноту прав перечислением ролей: набор ролей администратора
        различается между конфигурациями и внедрениями.
      - Полнота прав это не разрешение на конкретные данные. Право на запись
        проверяется управлением доступом, а не этой функцией.
      
      ### 3. Понять, что сеанс внешнего пользователя
      
      **Задача:** для контрагента, работающего через отдельный вход, показать другой
      интерфейс.
      
      **Функции:**
      
      `Пользователи.ЭтоСеансВнешнегоПользователя() Экспорт` и парная
      `ПользователиКлиент.ЭтоСеансВнешнегоПользователя() Экспорт` - функции, регион
      `ПрограммныйИнтерфейс`.
      
      `ВнешниеПользователи.ПолучитьОбъектАвторизацииВнешнегоПользователя(ВнешнийПользователь = Неопределено) Экспорт`
      - функция, тот же регион. Сервер. Возвращает того контрагента или физическое
      лицо, от имени которого работает внешний пользователь.
      
      `ВнешниеПользователи.ИспользоватьВнешнихПользователей() Экспорт` - функция, тот
      же регион: включен ли механизм вообще.
      
      **Нюансы и антипаттерны:**
      
      - Не обращаться к справочнику внешних пользователей, не проверив
        `ИспользоватьВнешнихПользователей`: при выключенном механизме справочник пуст, и
        ветка кода отработает молча и неверно.
      - Текущий пользователь в сеансе внешнего пользователя это ВНЕШНИЙ пользователь.
        Объект авторизации берется отдельной функцией.
      
      ### 4. Найти пользователя по учетной записи базы
      
      **Задача:** сопоставить учетную запись информационной базы с элементом
      справочника.
      
      **Функции:**
      
      `Пользователи.НайтиПоИдентификатору(Знач ИдентификаторПользователяИБ) Экспорт`,
      `Пользователи.НайтиПоИмени(Знач ИмяДляВхода) Экспорт`,
      `Пользователи.НайтиПоСсылке(Пользователь) Экспорт` - функции, регион
      `ПрограммныйИнтерфейс`. Сервер.
      
      **Нюансы и антипаттерны:**
      
      - Не искать пользователя запросом по наименованию справочника: имя для входа и
        наименование это разные поля, и совпадают они не всегда.
      - Пустой результат штатный: учетная запись могла быть удалена из базы, а элемент
        справочника остаться.
      
      ### 5. Выполнить свое действие при записи пользователя
      
      **Задача:** при создании учетной записи завести связанные данные.
      
      **Функции:**
      
      `ПользователиПереопределяемый.ПриЗаписиПользователяИнформационнойБазы(Знач СтарыеСвойства, Знач НовыеСвойства) Экспорт`
      - процедура, регион `ПрограммныйИнтерфейс`. ХУК: библиотека вызывает его сама.
      
      `ПользователиПереопределяемый.ПослеУдаленияПользователяИнформационнойБазы(Знач СтарыеСвойства) Экспорт`
      - процедура, тот же регион и та же роль.
      
      `ПользователиПереопределяемый.ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт`
      - процедура, тот же регион: объявляет, какие роли считать служебными и какие
      назначаются автоматически.
      
      **Нюансы и антипаттерны:**
      
      - Не вызывать процедуры `ПользователиПереопределяемый` из прикладного кода: их
        реализуют.
      - В хуке приходят СВОЙСТВА, а не объект: старые и новые. Обращаться к справочнику
        за тем, что уже передано, незачем.
      
      ## Различия версий
      
      Состав модулей семейства в 3.1.11 и 3.2.1 совпадает - сверено по обеим поставкам.
      
      ## Проверка перед использованием
      
      ```bash
      python skills/1c-bsp-api/scripts/bsp-api.py check Пользователи.ТекущийПользователь
      ```
      
  • SKILL.md 12.1 KB
    ---
    name: 1c-ssl-patterns
    description: "Прикладные сценарии Библиотеки стандартных подсистем (БСП): КАК решается задача разработчика, каким механизмом библиотеки, в каком порядке и с какими ограничениями. Используй когда нужно СДЕЛАТЬ что-то через БСП - запустить задание по расписанию, выполнить долгую операцию в фоне, напечатать форму, раздать права, обновить данные при переходе на новую версию; когда непонятно, какой механизм библиотеки закрывает задачу; когда нужен рабочий порядок вызовов и перечень антипаттернов. НЕ для вопроса о сигнатуре или существовании метода - там 1c-bsp-api. НЕ для регистрации своих обработок и команд в библиотеке - там 1c-bsp-command и 1c-bsp-registration."
    ---
    
    # Прикладные сценарии БСП
    
    Справочник отвечает на вопрос КАК ПРИМЕНЯТЬ механизм библиотеки. На вопросы
    существует ли вызов, какая у него сигнатура и в каком контексте он доступен
    отвечает другой скил - `1c-bsp-api`.
    
    Разделение точек входа:
    
    | Вопрос | Скил |
    |---|---|
    | как сделать X через БСП, каким механизмом, в каком порядке | этот |
    | какая сигнатура, существует ли вызов, серверный он или клиентский | `1c-bsp-api` |
    | как зарегистрировать свою обработку или команду в библиотеке | `1c-bsp-command`, `1c-bsp-registration` |
    
    Разведение по триггерам не означает взаимного исключения: прикладной сценарий
    ДОЛЖЕН проверять вызовы через `1c-bsp-api`, и это часть работы, а не переход к
    другому скилу.
    
    ## Порядок работы
    
    1. Определи МЕХАНИЗМ задачи и возьми справочник по таблице ниже. Грузится один
       справочник НА МЕХАНИЗМ: задача из трех механизмов законно требует трех.
       Справочник "на всякий случай" не грузится.
    2. Внутри справочника найди сценарий по заголовку `###` и прочитай его диапазоном.
       Файл целиком не загружается.
    3. **Проверь каждый вызов перед тем, как его написать.** Имена в БСП длинные и
       составные, поэтому выдумка выглядит как настоящее имя:
    
       ```bash
       python skills/1c-bsp-api/scripts/bsp-api.py check РегламентныеЗаданияСервер.НайтиЗадания
       ```
    
       Проверка сообщает и об устаревании, а не только о существовании. Код возврата
       1, если вызова нет.
    4. Сценария нет в справочниках - искать по теме через `ssl_search` сервера
       `1c-mcp_ssl_server`, затем подтверждать найденное проверкой из пункта 3.
       MCP судит по документации и называет методы, которых в этой версии нет.
    
    **При расхождении источников** прав тот, что ближе к поставке: исходник модуля
    старше справочника `1c-bsp-api`, справочник старше MCP.
    
    ## Справочники по механизмам
    
    | Механизм и ключевые слова | Файл |
    |---|---|
    | реквизит объекта без чтения объекта, сообщение пользователю, коллекции, безопасный режим, режим работы базы | `references/base-functionality.md` |
    | задание по расписанию, планировщик, включить и выключить задание, расписание | `references/scheduled-jobs.md` |
    | текущий пользователь, полнота прав, внешний пользователь, учетная запись базы | `references/users.md` |
    | право на запись, роль, профиль группы доступа, наборы значений доступа, пересчет прав | `references/access-management.md` |
    | печать, печатная форма, команда печати, макет, менеджер печати | `references/printing.md` |
    | присоединенный файл, вложение, том хранения, сканирование, открыть файл | `references/attached-files.md` |
    | обработчик обновления, переход на новую версию, отложенное обновление, версия ИБ | `references/infobase-update.md` |
    | установка обновления, поиск обновлений, резервная копия перед обновлением | `references/configuration-update.md` |
    | вариант отчета, размещение отчета в разделах, команда отчета на форме | `references/report-variants.md` |
    | внешняя обработка, дополнительный отчет, внешняя печатная форма, подключить обработку | `references/external-reports-processors.md` |
    | команда на форме от другой подсистемы, размещение команд, обновление команд после записи | `references/attachable-commands.md` |
    | дополнительный реквизит, дополнительное сведение, набор свойств, метки | `references/additional-properties.md` |
    | запрет правки поля после проведения, разблокировка реквизитов на форме | `references/attribute-locking.md` |
    | закрытый период, дата запрета изменения, запрет загрузки данных | `references/period-end-closing.md` |
    | история изменений объекта, версия объекта, откат к прежней версии | `references/object-versioning.md` |
    | префикс номера, префикс базы, префикс организации, номер на печать | `references/object-prefixes.md` |
    | синхронизация баз, узел обмена, регистрация изменений, универсальный формат | `references/data-exchange.md` |
    | адрес, телефон, почта объекта, вид контактной информации | `references/contact-information.md` |
    | отправить письмо, загрузить входящие, учетная запись почты, небезопасный HTML | `references/email.md` |
    | дубли элементов, замена на оригинал, удаление помеченных, ссылочная целостность | `references/duplicates-and-deletion.md` |
    | подписать объект, сертификат, штамп подписи в печатной форме | `references/digital-signature.md` |
    | доверенность ФНС, облачная подпись DSS, мобильная подпись | `references/signature-services.md` |
    | задача, бизнес-процесс, адресация по роли, отложенный старт | `references/business-processes.md` |
    | данные на нескольких языках, подстановка языка в запрос | `references/multilanguage.md` |
    | шаблон письма, подстановка данных объекта, получатели по шаблону | `references/message-templates.md` |
    | персональные данные, согласие субъекта, срок уничтожения | `references/personal-data.md` |
    | курс валюты, сумма прописью, банк по БИК, рабочие даты по графику и календарю | `references/currencies-banks-calendars.md` |
    | регион по коду, коды адреса, адресный реестр | `references/address-classifier.md` |
    | загрузка из файла в справочник, групповое изменение, выгрузка в файлы, структура подчиненности | `references/bulk-data-operations.md` |
    | напоминание, заметка, текущие дела, письма и звонки контакту | `references/user-workplace.md` |
    | загрузка по сети и прокси, SMS, штрихкод, внешняя компонента | `references/integration-basics.md` |
    | проверка корректности данных, регистр проблем, рассылка отчетов по расписанию | `references/accounting-checks-and-reports.md` |
    | состояние бумажного оригинала, склонение по падежам, конструктор формул | `references/document-workflow-extras.md` |
    | публикация OData, сообщение при запуске, отчет о движениях, ручной порядок в списке | `references/extension-points.md` |
    | сведения об организации, ответственные лица, форма настроек программы | `references/organizations-and-settings.md` |
    | завершение сеансов, безопасный режим и разрешения, журнал действий, резервная копия | `references/administration.md` |
    | замер ключевой операции, статистика использования, полнотекстовый поиск, итоги | `references/monitoring-and-search.md` |
    | модель сервиса и разделение данных, обсуждения, анкетирование | `references/service-model-and-collaboration.md` |
    
    **Реестр тем закрыт целиком: 70 тем главы 3 документации в 38 справочниках.**
    Механизмы, у которых прикладного интерфейса нет, названы явно вместе с причиной -
    это тоже знание, и оно удерживает от поиска несуществующих модулей.
    
    ## Если справочника еще нет
    
    `ssl_search` сервера `1c-mcp_ssl_server` - векторный поиск по документации БСП.
    Запрос формулируется описанием задачи на русском: `ssl_search("фоновое задание
    прогресс")`. У сервера РОВНО ОДИН инструмент; имен вида `get_function_info` или
    `search_modules` на нем нет.
    
    Существование найденного подтверждается `bsp-api.py check`, а не самим поиском.
    
    ## Происхождение
    
    Сценарии написаны нами по документации ИТС и исходникам библиотеки. Имена,
    сигнатуры, состав параметров и номера версий - факты и взяты как есть; сигнатуры
    и регионы берутся из поставки библиотеки, потому что документация с ней местами
    расходится. Примеры BSL свои и проверены `check`.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related