Регистр бухгалтерии 1С хранит проводки: в каждой записи счёт дебета, счёт кредита, сумма и аналитика по субконто. Программисту важна связка трёх объектов — плана счетов, плана видов характеристик (ПВХ) с видами субконто и самого регистра. Ниже — как они связаны, как сформировать проводки в ОбработкаПроведения с количеством и валютой, как получить остатки, обороты и корреспонденцию запросом и как это устроено в КА 2.5. Платформа 8.3.
ТипЗначения: у вида «Договоры» — только справочники договоров. Предопределённые элементы дают имена для кода: ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты.ВидыСубконто: вид субконто, флаг «Только обороты», признаки учёта субконто («Суммовой» и другие).Запись в регистре бухгалтерии 1С с корреспонденцией — это проводка, и её поля зависят от метаданных:
| В метаданных | Поля записи | Пример (КА 2.5) |
|---|---|---|
| Балансовое измерение | Одно поле на проводку | Организация |
| Небалансовое измерение | Два поля: по дебету и по кредиту | ВалютаДт, ВалютаКт, ПодразделениеДт |
| Балансовый ресурс | Одно поле: сумма дебета равна сумме кредита | Сумма, СуммаУУ |
| Небалансовый ресурс | Два поля: по дебету и по кредиту | КоличествоДт, ВалютнаяСуммаКт, СуммаНУДт |
| Субконто | Коллекции СубконтоДт и СубконтоКт, ключ — вид субконто | СубконтоКт[ВидСубконто] |
Без корреспонденции запись описывает одну сторону: Счет, ВидДвижения (ВидДвиженияБухгалтерии.Дебет или Кредит) и Субконто, а таблицы ОборотыДтКт нет. Регистратор обязателен: в 1С 8 регистр бухгалтерии всегда подчинён регистратору.
Движения по регистру бухгалтерии документ пишет через ту же коллекцию Движения, что и для других регистров; общие правила — в статье про движения документа. Пример — условный документ «Поступление импорта»: товар приходуется на 41.01, долг перед иностранным поставщиком — на 60.21 в валюте. Имена счетов, видов субконто и ресурсов — из КА 2.5, в своей конфигурации подставьте свои.
// Модуль объекта документа ПоступлениеИмпорта (документ условный).
// Шапка: Организация, Контрагент, Договор, Валюта, Курс, Кратность.
// Табличная часть Товары: Номенклатура, Количество, СуммаВалюта.
// Регистр бухгалтерии Хозрасчетный (с корреспонденцией) отмечен в движениях.
// Имена плана счетов, ПВХ видов субконто и ресурсов — как в КА 2.5.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если Курс = 0 Или Кратность = 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = НСтр("ru = 'Не заполнен курс валюты документа.'");
Сообщение.Сообщить();
Отказ = Истина;
Возврат;
КонецЕсли;
Проводки = Движения.Хозрасчетный;
Проводки.Записывать = Истина;
СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; // 41.01
СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиВал; // 60.21
ВидыСубконто = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные;
// Признаки учёта — булевы свойства ссылки на счёт.
УчетКоличества = СчетДт.Количественный;
УчетВалюты = СчетКт.Валютный;
Для Каждого СтрокаТоваров Из Товары Цикл
Проводка = Проводки.Добавить();
Проводка.Период = Дата;
Проводка.Организация = Организация; // балансовое измерение: одно на проводку
Проводка.СчетДт = СчетДт;
Проводка.СчетКт = СчетКт;
Проводка.Содержание = НСтр("ru = 'Поступление импортного товара'");
// Субконто: ключ коллекции — вид субконто (элемент ПВХ).
УстановитьСубконто(Проводка.СубконтоДт, СчетДт, ВидыСубконто.Номенклатура, СтрокаТоваров.Номенклатура);
УстановитьСубконто(Проводка.СубконтоКт, СчетКт, ВидыСубконто.Контрагенты, Контрагент);
УстановитьСубконто(Проводка.СубконтоКт, СчетКт, ВидыСубконто.Договоры, Договор);
// Балансовый ресурс: одна сумма в рублях на дебет и кредит.
Проводка.Сумма = Окр(СтрокаТоваров.СуммаВалюта * Курс / Кратность, 2);
// Небалансовые ресурсы и измерения: у каждой стороны свои,
// заполняем, только если у счёта установлен признак учёта.
Если УчетКоличества Тогда
Проводка.КоличествоДт = СтрокаТоваров.Количество;
КонецЕсли;
Если УчетВалюты Тогда
Проводка.ВалютаКт = Валюта;
Проводка.ВалютнаяСуммаКт = СтрокаТоваров.СуммаВалюта;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Пишет значение субконто, если вид есть у счёта и тип значения подходит.
Процедура УстановитьСубконто(Субконто, Счет, ВидСубконто, Значение)
Если Счет.ВидыСубконто.Найти(ВидСубконто, "ВидСубконто") = Неопределено Тогда
Возврат; // такого вида субконто у счёта нет
КонецЕсли;
Если Не ВидСубконто.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
Возврат; // значение не того типа
КонецЕсли;
Субконто[ВидСубконто] = Значение;
КонецПроцедуры
Проводки.Записывать = Истина — после обработчика платформа запишет набор вместо прежних проводок документа.Организация и Сумма — балансовые поля, одно значение на проводку: единая сумма по дебету и кредиту держит баланс.КоличествоДт, ВалютаКт, ВалютнаяСуммаКт — небалансовые поля, у каждой стороны свои. Признаки учёта читаются как свойства ссылки на счёт: СчетДт.Количественный.Субконто[ВидСубконто] = Значение: ключом коллекции СубконтоДт или СубконтоКт служит ссылка на вид субконто. У предопределённых видов есть запись по имени: Проводка.СубконтоКт.Контрагенты = Контрагент; у добавленных пользователями — только ссылка.УстановитьСубконто проверяет, что вид есть у счёта и тип значения подходит: код не зависит от настройки аналитики. В КА 2.5 у предопределённого счёта 41.01 видов субконто в конфигурации нет вовсе, а для таких случаев есть типовая процедура БухгалтерскийУчет.УстановитьСубконто.Программно регистры бухгалтерии читают запросом на сервере. Физическая таблица РегистрБухгалтерии.Хозрасчетный — это сами проводки, остатки и обороты дают виртуальные таблицы.
| Таблица | Параметры | Что даёт |
|---|---|---|
| Остатки | Период, УсловиеСчета, Субконто, Условие | Сальдо на момент: СуммаОстаток, СуммаОстатокДт, СуммаОстатокКт |
| Обороты | НачалоПериода, КонецПериода, Периодичность, УсловиеСчета, Субконто, Условие, УсловиеКорСчета, КорСубконто | Обороты счёта с полями КорСчет, КорСубконто1… |
| ОстаткиИОбороты | НачалоПериода, КонецПериода, Периодичность, МетодДополнения, УсловиеСчета, Субконто, Условие | Сальдо на начало и конец и обороты — данные для ОСВ |
| ОборотыДтКт | НачалоПериода, КонецПериода, Периодичность, УсловиеСчетаДт, СубконтоДт, УсловиеСчетаКт, СубконтоКт, Условие | Обороты по парам счетов; только у регистра с корреспонденцией |
| ДвиженияССубконто | НачалоПериода, КонецПериода, Условие, Порядок, Первые | Проводки с субконто, развёрнутыми в поля |
Что важно в параметрах:
В ИЕРАРХИИ, чтобы захватить субсчета. В ОборотыДтКт поля условий — СчетДт и СчетКт.Субконто1, второй — в Субконто2. Без массива Субконто1 — первое субконто каждого счёта, и в одной колонке смешаются контрагенты, склады и статьи затрат.Субконто1…СубконтоN. Ставьте его здесь, а не в ГДЕ; почему — в статье об остатках в запросе.Остаток по дебету и кредиту платформа раскладывает по виду счёта: на активном счёте он всегда дебетовый, на пассивном — кредитовый, на активно-пассивном — по знаку сальдо.
Функция для серверного общего модуля: остатки и обороты по счёту с субсчетами в разрезе контрагентов и договоров, как в ОСВ по счёту.
// Общий модуль с флагом «Сервер»: на клиенте объекта Запрос нет.
// ОСВ по счёту с субсчетами в разрезе контрагентов и договоров.
// Счет — например, ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками (60).
Функция ОСВПоСчетуССубконто(Организация, Счет, НачалоПериода, КонецПериода) Экспорт
// Порядок видов в массиве задаёт поля Субконто1 и Субконто2.
ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОСВ.Счет КАК Счет,
| ОСВ.Субконто1 КАК Контрагент,
| ОСВ.Субконто2 КАК Договор,
| ОСВ.СуммаНачальныйОстатокДт КАК НачальныйОстатокДт,
| ОСВ.СуммаНачальныйОстатокКт КАК НачальныйОстатокКт,
| ОСВ.СуммаОборотДт КАК ОборотДт,
| ОСВ.СуммаОборотКт КАК ОборотКт,
| ОСВ.СуммаКонечныйОстатокДт КАК КонечныйОстатокДт,
| ОСВ.СуммаКонечныйОстатокКт КАК КонечныйОстатокКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
| &НачалоПериода,
| &КонецПериода,
| ,
| ,
| Счет В ИЕРАРХИИ (&Счет),
| &ВидыСубконто,
| Организация = &Организация) КАК ОСВ
|
|УПОРЯДОЧИТЬ ПО
| ОСВ.Счет.Код";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
Запрос.УстановитьПараметр("Счет", Счет);
Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("Организация", Организация);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Счёт передаётся группой, например 60, а В ИЕРАРХИИ подтягивает 60.01, 60.21 и остальные субсчета. Строки получаются на уровне субсчетов. Итог по самому 60 — сумма строк или ИТОГИ … ПО Счет ИЕРАРХИЯ.
// Анализ субконто: остатки одного контрагента на всех счетах на дату.
// &ВидыСубконто — массив: ВидыСубконтоХозрасчетные.Контрагенты, ВидыСубконтоХозрасчетные.Договоры.
// &Граница — Новый Граница(КонецДня(Дата), ВидГраницы.Включая).
ВЫБРАТЬ
Остатки.Счет КАК Счет,
Остатки.Субконто2 КАК Договор,
Остатки.Валюта КАК Валюта,
Остатки.СуммаОстатокДт КАК ОстатокДт,
Остатки.СуммаОстатокКт КАК ОстатокКт,
Остатки.ВалютнаяСуммаОстаток КАК ВалютнаяСумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&Граница,
НЕ Счет.Забалансовый,
&ВидыСубконто,
Организация = &Организация
И Субконто1 = &Контрагент) КАК Остатки
УПОРЯДОЧИТЬ ПО
Остатки.Счет.Код
Условие Субконто1 = &Контрагент работает, потому что массив видов закрепил контрагента за первым полем на любом счёте. У счетов без вида «Контрагенты» поле пустое (NULL), и условие их отсекает.
// Корреспонденция: оплаты поставщикам за период, Дт 60 Кт 51/52, по контрагентам.
// &ВидыСубконтоДт — массив из одного вида: ВидыСубконтоХозрасчетные.Контрагенты.
// &СчетаДенег — массив: ПланыСчетов.Хозрасчетный.РасчетныеСчета, ПланыСчетов.Хозрасчетный.ВалютныеСчета.
// &НачалоПериода = НачалоДня(Дата1), &КонецПериода = КонецДня(Дата2).
ВЫБРАТЬ
ДтКт.СчетДт КАК СчетДт,
ДтКт.СубконтоДт1 КАК Контрагент,
ДтКт.СчетКт КАК СчетКт,
СУММА(ДтКт.СуммаОборот) КАК Сумма,
СУММА(ДтКт.ВалютнаяСуммаОборотДт) КАК ВалютнаяСумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
&НачалоПериода,
&КонецПериода,
,
СчетДт В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)),
&ВидыСубконтоДт,
СчетКт В ИЕРАРХИИ (&СчетаДенег),
,
Организация = &Организация) КАК ДтКт
СГРУППИРОВАТЬ ПО
ДтКт.СчетДт,
ДтКт.СубконтоДт1,
ДтКт.СчетКт
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
У балансового ресурса в ОборотыДтКт одно поле — СуммаОборот, у небалансовых пара: ВалютнаяСуммаОборотДт и ВалютнаяСуммаОборотКт. Субконто кредита здесь не нужны, поэтому параметр СубконтоКт пустой.
// Тот же серверный общий модуль.
// Проводки документа в читаемом виде: счета, субконто, суммы.
// Документ — ссылка на любой документ-регистратор регистра Хозрасчетный.
Функция ПроводкиДокумента(Документ) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Проводки.НомерСтроки КАК НомерСтроки,
| Проводки.СчетДт КАК СчетДт,
| Проводки.СубконтоДт1 КАК СубконтоДт1,
| Проводки.СубконтоДт2 КАК СубконтоДт2,
| Проводки.СубконтоДт3 КАК СубконтоДт3,
| Проводки.СчетКт КАК СчетКт,
| Проводки.СубконтоКт1 КАК СубконтоКт1,
| Проводки.СубконтоКт2 КАК СубконтоКт2,
| Проводки.СубконтоКт3 КАК СубконтоКт3,
| Проводки.Сумма КАК Сумма,
| Проводки.КоличествоДт КАК КоличествоДт,
| Проводки.ВалютаКт КАК ВалютаКт,
| Проводки.ВалютнаяСуммаКт КАК ВалютнаяСуммаКт,
| Проводки.Содержание КАК Содержание
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, , Регистратор = &Документ, , ) КАК Проводки
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
Запрос.УстановитьПараметр("Документ", Документ);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
ДвиженияССубконто разворачивает коллекции субконто в поля ВидСубконтоДт1, СубконтоДт1 и далее. Если у счёта два субконто, третье поле — NULL. Запросы из статьи удобно отлаживать в бесплатной консоли запросов.
В КА 2.5 регистр бухгалтерии Хозрасчетный и связанные объекты выглядят так (имена сверены по выгрузке конфигурации):
| Объект | Имя в метаданных | В интерфейсе |
|---|---|---|
| План счетов | ПланыСчетов.Хозрасчетный | План счетов бухгалтерского учета |
| ПВХ видов субконто | ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные | Виды субконто хозрасчетные |
| Регистр бухгалтерии | РегистрыБухгалтерии.Хозрасчетный | Журнал проводок (регламентированный учет) |
| Ручные проводки | Документы.ОперацияБух | Операция (регламентированный учет) |
| Формирование проводок | Обработка ОтражениеДокументовВРеглУчете | Отражение документов в регламентированном учете |
Регистр с корреспонденцией, до трёх субконто на счёте. Балансовые — измерение Организация и ресурсы Сумма, СуммаУУ, СуммаФО. Небалансовые измерения Валюта, Подразделение, НаправлениеДеятельности и ресурсы ВалютнаяСумма, Количество, СуммаНУ, СуммаПР, СуммаВР привязаны к признакам учёта счёта: Валютный, Количественный, УчетПоПодразделениям и другим.
Главное отличие от примера выше: документы оперативного учёта КА при проведении проводок не формируют. Документ попадает в регистр сведений ОтражениеДокументовВРеглУчете со статусом «К отражению», а проводки с ним в роли регистратора создаёт рабочее место «Отражение документов в регламентированном учете» — по кнопке или регламентным заданием. Из кода то же делает функция РеглУчетПроведениеСервер.ОтразитьДокументыВРеглУчете(МассивДокументов): она возвращает документы, которые отразить не удалось.
При перепроведении проводки очищаются до следующего отражения, и ПроводкиДокумента до него вернёт пустую таблицу. Проводки типового документа правят настройкой счетов учёта или документом «Операция (регламентированный учет)», а не кодом в ОбработкаПроведения. Результат смотрят отчётами «Оборотно-сальдовая ведомость по счету», «Анализ субконто» и «Отчет по проводкам» в разделе «Регламентированный учет».
Проводка.Количество = 5 в регистре с корреспонденцией падает с ошибкой «Поле объекта не обнаружено (Количество)»: у небалансового ресурса есть только КоличествоДт и КоличествоКт. В запросе к физической таблице то же поле даст «Поле не найдено».Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками) ищет проводки на самом 60, а они на 60.01, 60.21 и других субсчетах. Ошибки нет, результат пустой.Субконто1 — поле составного типа, и Субконто1.ИНН добавляет в запрос соединения с таблицами многих типов ПВХ, а у ВидыСубконтоХозрасчетные в КА 2.5 их больше сотни. Сначала приведите тип — см. ВЫРАЗИТЬ в запросе.Движения.Хозрасчетный, дописанные в ОбработкаПроведения, не переживут перепроведение и отражение: механизм КА формирует проводки сам.Регистр бухгалтерии привязан к плану счетов: аналитика задаётся субконто для каждого счёта, а не общими измерениями, и одна запись с корреспонденцией хранит обе стороны проводки. В регистре накопления измерения общие для всех записей, а у регистра остатков вид движения — приход или расход. Подробнее — в статье про регистр накопления.
Нет. Набор можно создать кодом через РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(), но в отборе всё равно указывается регистратор. Ручные проводки вводят документом-операцией: в КА 2.5 это «Операция (регламентированный учет)».
Только по ссылке: имена есть лишь у предопределённых видов. Храните ссылку на элемент ПВХ в константе или настройке и передавайте её в СубконтоДт[…] и в массив параметра Субконто. Тип значения нового вида должен входить в составной тип ПВХ, иначе нужна доработка конфигурации.
На счёте у этого вида субконто стоит флаг «Только обороты»: в его разрезе платформа хранит только обороты. В КА 2.5 так настроены, например, статьи затрат на счёте 41.ДР. Нужен остаток по такой аналитике — меняйте настройку счёта, а не запрос.
Проводки своего документа, нестандартный отчёт по счетам и субконто или разбор отражения в КА проще отдать программисту, который работал с планом счетов. Посмотрите услуги по доработке 1С или разместите задачу — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.