К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как обратиться к плану счетов программно в 1С

Как программно обратиться к плану счетов в 1С: методы НайтиПоКоду, НайтиПоНаименованию, выборка счетов, работа с субконто и признаками учета. Примеры кода.

План счетов в 1С — это объект метаданных, который хранит структуру бухгалтерских счетов: коды, наименования, виды субконто, признаки учета (количественный, валютный, налоговый). Программное обращение к нему нужно при формировании проводок, заполнении отчетов, загрузке данных из файлов и при любой интеграции, где требуется найти или проверить счет учета по коду или наименованию.

Работа с планом счетов строится через менеджер объекта ПланыСчетов. В типовых конфигурациях основной план счетов обычно называется «Хозрасчетный», но в самописных решениях имя может быть любым — его нужно уточнить в конфигураторе перед написанием кода. Все методы поиска и выборки вызываются именно через ПланыСчетов.ИмяПланаСчетов.

Важно понимать разницу между ссылкой на счет и объектом счета. Ссылка — это легковесный идентификатор, который достаточен для подстановки в проводку или реквизит документа. Объект нужен только тогда, когда вы собираетесь изменять данные счета: наименование, признаки учета, состав субконто. Чтение реквизитов возможно и через ссылку без получения объекта.

Как устроено обращение к плану счетов через менеджер

Точка входа для любой программной работы — менеджер плана счетов. Он доступен как в серверном, так и в клиентском контексте (для управляемых форм чтение данных выполняется на сервере). Базовый синтаксис выглядит так: ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.01").

Менеджер предоставляет несколько групп методов: поиск (НайтиПоКоду, НайтиПоНаименованию), выборку (Выбрать, ВыбратьИерархически), создание (СоздатьСчет) и работу с предопределенными элементами. Возвращаемое значение методов поиска — ссылка типа ПланСчетовСсылка. Если элемент не найден, возвращается пустая ссылка, которую обязательно нужно проверить через Ссылка.Пустая() перед использованием.

bsl
СчетМатериалы = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.01");
Если СчетМатериалы.Пустая() Тогда
    Сообщить("Счет 10.01 не найден в плане счетов");
Иначе
    Сообщить("Найден счет: " + СчетМатериалы.Наименование);
КонецЕсли;

Поиск счета по коду и наименованию

Метод НайтиПоКоду ищет счет по точному совпадению кода. Код передается строкой в том виде, в каком он хранится в плане счетов, включая разделители: «10.01», «60.01», «90.01.1». Если в конфигурации используются маски кода или отбор по родителю, метод принимает дополнительные параметры, но в большинстве случаев достаточно одного аргумента.

Метод НайтиПоНаименованию ищет по наименованию счета. По умолчанию поиск идет по точному совпадению; третий параметр позволяет искать по началу строки. Этот способ менее надежен, чем поиск по коду: наименования могут меняться при обновлениях конфигурации, а коды остаются стабильными. Поэтому в прикладном коде приоритет всегда у поиска по коду.

Третий удобный способ — обращение к предопределенным счетам через их имя, заданное в конфигураторе: ПланыСчетов.Хозрасчетный.КассаОрганизации. Такой код не зависит от данных информационной базы и работает быстрее поиска, но доступен только для счетов, помеченных разработчиком как предопределенные.

Типичные ошибки
01
Использование результата НайтиПоКоду без проверки на пустую ссылку — при отсутствии счета получите ошибку при обращении к реквизитам
02
Поиск по наименованию вместо кода — после обновления конфигурации наименование может измениться, и код перестанет находить счет
03
Передача кода без разделителей (1001 вместо 10.01) — поиск не найдет элемент, хотя счет существует

Перебор счетов через выборку и запрос

Когда нужно получить не один счет, а список — например, все счета с валютным признаком учета — используется метод Выбрать(). Он возвращает выборку, которую перебирают в цикле Пока Выборка.Следующий() Цикл. Метод принимает параметры отбора: родителя, владельца и структуру с произвольными полями.

Для сложных условий выборка уступает запросу. Запросом можно отобрать счета по любым реквизитам, включая табличную часть видов субконто, и сразу получить нужные поля без обращения к объекту. Запрос также быстрее при большом количестве элементов, так как выполняется одним обращением к базе данных.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Хозрасчетный.Ссылка КАК Счет,
|    Хозрасчетный.Код КАК Код
|ИЗ
|    ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
|    Хозрасчетный.Валютный
|    И НЕ Хозрасчетный.ЗапретитьИспользоватьВПроводках";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Сообщить(Результат.Код);
КонецЦикла;

Для иерархического обхода (счета и их субсчета) применяется ВыбратьИерархически или запрос с условием Ссылка В ИЕРАРХИИ(&Родитель). Это удобно, когда нужно собрать все субсчета, например, счета 60 или 62, для сводного отчета.

Чтение реквизитов счета: субконто и признаки учета

Через ссылку доступны основные реквизиты счета: Код, Наименование, Вид (активный, пассивный, активно-пассивный), Валютный, Количественный, Забалансовый, ЗапретитьИспользоватьВПроводках. Обращение к реквизиту ссылки выполняется неявным запросом к базе, поэтому в циклах лучше заранее выбрать нужные поля запросом, чтобы не генерировать сотни мелких обращений.

Виды субконто хранятся в табличной части счета «ВидыСубконто». Каждая строка содержит ссылку на план видов характеристик «ВидыСубконтоХозрасчетные» и признаки учета по этому субконто. Перебрать их можно так: Для Каждого СтрокаСубконто Из Счет.ВидыСубконто Цикл. Это нужно, например, при программном формировании проводок, чтобы корректно заполнить субконто по каждому счету.

Создание и изменение счетов программно

Новый счет создается методом СоздатьСчет(). После вызова заполняются код, наименование, вид, признаки учета и при необходимости табличная часть субконто, затем вызывается Записать(). Если счет должен быть субсчетом, перед записью устанавливается свойство Родитель.

Для изменения существующего счета сначала получают объект: ОбъектСчета = Счет.ПолучитьОбъект(), затем меняют реквизиты и записывают. Получение объекта блокирует элемент в транзакции, поэтому не стоит получать объект, если требуется только чтение — это лишняя нагрузка и потенциальные конфликты блокировок в многопользовательском режиме.

Использование счета в проводках и документах

На практике чаще всего счет нужен для подстановки в движения регистра бухгалтерии. В модуле документа при формировании проводок счет присваивается полям СчетДт и СчетКт записи регистра, а субконто заполняются через коллекцию СубконтоДт или СубконтоКт с обращением по виду субконто.

Рекомендуемый подход — не искать счет в каждой проводке заново, а получить все нужные ссылки один раз перед циклом проводок и хранить их в структуре. Это заметно ускоряет проведение документов с большим числом строк и упрощает контроль ошибок: если какой-то счет не найден, об этом станет известно до начала формирования движений.

Порядок действий
  1. 1
    Уточните имя плана счетов в конфигураторе (обычно Хозрасчетный)
  2. 2
    Получите ссылку: ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01")
  3. 3
    Проверьте результат: Если Счет.Пустая() Тогда — обработайте отсутствие счета
  4. 4
    Подставьте ссылку в проводку: Движение.СчетДт = Счет
  5. 5
    Заполните субконто: Движение.СубконтоДт[ВидыСубконто.Контрагенты] = Контрагент
  6. 6
    Проверьте результат в отчете «Оборотно-сальдовая ведомость» после проведения

Проверка результата и диагностика проблем

После программного обращения к плану счетов результат проверяется двумя способами. На уровне кода — проверкой пустой ссылки и контрольным выводом кода и наименования найденного счета. На уровне учета — формированием оборотно-сальдовой ведомости или анализа счета: если проводки попали не на те счета, причина обычно в неверном коде поиска или в путанице с субсчетами.

Частая ситуация — код находит счет, но проводка не формируется корректно, потому что вид субконто не назначен счету. Перед заполнением субконто убедитесь, что нужный вид присутствует в табличной части счета, иначе присвоение не сработает или приведет к ошибке. Еще одна причина «невидимых» счетов — пометка на удаление: методы поиска находят и помеченные элементы, поэтому при необходимости добавляйте проверку Счет.ПометкаУдаления.

Контрольные точки

Как проверить результат

Результат НайтиПоКоду
Норма

Ссылка не пустая, код и наименование совпадают с ожидаемыми

Тревожный признак

Пустая ссылка или найден другой счет — проверьте формат кода и разделители

Субконто в проводке
Норма

Субконто заполнены значениями нужных типов

Тревожный признак

Субконто пустые — вид субконто не назначен счету или использовано неверное имя вида

Проводки после проведения
Норма

ОСВ показывает обороты по ожидаемым счетам

Тревожный признак

Обороты на других счетах — неверный код поиска или перепутаны Дт и Кт

Часто задаваемые вопросы

Чем отличается НайтиПоКоду от обращения к предопределенному счету?

НайтиПоКоду ищет элемент в базе данных по строке кода и работает с любыми счетами, включая созданные пользователем. Обращение к предопределенному счету по имени (ПланыСчетов.Хозрасчетный.КассаОрганизации) возможно только для счетов, отмеченных разработчиком в конфигураторе, но оно быстрее и не зависит от данных конкретной базы.

Почему НайтиПоКоду возвращает пустую ссылку, хотя счет есть в плане счетов?

Чаще всего причина в формате кода: передан код без разделителей, с лишними пробелами или с другим разделителем. Сравните переданную строку с фактическим кодом счета в режиме предприятия. Также проверьте, что обращаетесь к правильному плану счетов — в конфигурации их может быть несколько.

Можно ли обратиться к плану счетов из внешней обработки?

Да, менеджер ПланыСчетов доступен в модуле объекта внешней обработки так же, как и в модулях конфигурации. Ограничение одно: обработка, рассчитанная на конкретное имя плана счетов, не запустится в конфигурации, где план счетов называется иначе, поэтому имя иногда выносят в параметры.

Как получить все субсчета конкретного счета одним запросом?

Используйте запрос к таблице плана счетов с условием Ссылка В ИЕРАРХИИ(&Родитель), передав в параметр ссылку на родительский счет. В результат попадут все вложенные субсчета любого уровня. Если нужны только прямые потомки, замените условие на равенство поля Родитель.

Безопасно ли программно удалять счета из плана счетов?

Непосредственное удаление счетов, по которым есть движения в регистре бухгалтерии, приведет к битым ссылкам в проводках и ошибкам в отчетах. Правильный путь — установка пометки на удаление, после чего штатная обработка удаления помеченных объектов проверит наличие ссылок и не даст удалить используемый счет.

Как узнать вид счета (активный, пассивный, активно-пассивный) программно?

Через реквизит Вид ссылки на счет: Счет.Вид вернет значение перечисления ВидСчета. Сравнить его можно с ВидСчета.Активный, ВидСчета.Пассивный или ВидСчета.АктивноПассивный. Это полезно при автоматической разноске остатков, где от вида счета зависит, куда относить сальдо.

Итог

Что важно запомнить

Обращение к плану счетов выполняется через ПланыСчетов.ИмяПланаСчетов. Ищите счета по коду, всегда проверяйте результат на пустую ссылку, для массовых операций используйте запрос вместо перебора, а объект получайте только когда нужно изменить данные. Не меняйте и не удаляйте счета, по которым уже есть проводки.