Добрый день!

Стоит такая задача: необходимо получить на определенную дату срез остатков по регистру бухгалтерии Хозрасчетный, на основании полученных данных создать документ "Корректировка записей регистров" и очистить все движения раньше даты среза.

Проблема в том, что нет достаточных знаний по видению данного регистра.

Вот часть кода:

```1c
    ТекРегистр = Метаданные.РегистрыБухгалтерии.Хозрасчетный;

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ *
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаСреза) КАК ТекущийРегистрНакопления
    |";

    Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза) + 1);

    Выгрузка = Запрос.Выполнить().Выгрузить();

    ДокументКорректировки = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();

    ДокументКорректировки.Дата = КонецДня(ДатаСреза);
    ДокументКорректировки.Комментарий = "Перенос остатков по регистру: " + ТекРегистр.Синоним;

    НоваяСтрока = ДокументКорректировки.ТаблицаРегистровБухгалтерии.Добавить();
    НоваяСтрока.Имя = ТекРегистр.Имя;
    НоваяСтрока.Представление = ТекРегистр.Синоним;

    Для Каждого Стр Из Выгрузка Цикл

    СтрокаЗаписи = ДокументКорректировки.Движения[ТекРегистр.Имя].Добавить();

    СтрокаЗаписи.Период = КонецДня(ДатаСреза);

    Для Каждого Колонка Из Выгрузка.Колонки Цикл

    СтрокаЗаписи[ИмяКолонки]= Стр[Колонка.Имя]; // ВОТ ТУТ ВОПРОС

    КонецЦикла;

    КонецЦикла;

    ДокументКорректировки.Записать();

    Сообщить ("Создан документ: " + ДокументКорректировки);
```

Из запроса я получаю реквизиты:
Валюта,
ВалютнаяСуммаОстаток,
ВалютнаяСуммаОстатокДТ,
ВалютнаяСуммаОстатокКТ,
ВалютнаяСуммаРазвернутыйОстатокДТ,
ВалютнаяСуммаРазвернутыйОстатокКТ,
КоличествоОстаток,
КоличествоОстатокДТ,
КоличествоОстатокКТ,
КоличествоРазвернутыйОстатокДТ,
КоличествоРазвернутыйОстатокКТ,
Организация,
Субконто1,
Субконто2,
Субконто3,
СуммаОстаток,
СуммаОстатокДТ,
СуммаОстатокКТ,
СуммаРазвернутыйОстатокДТ,
СуммаРазвернутыйОстатокКТ,
Счет

Строка записи движения имеет реквизиты:
Активность,
ВалютаДТ,
ВалютаКТ,
ВалютнаяСуммаДТ,
ВалютнаяСуммаКТ,
ВидРегламентнойОперации,
ДатаЗаписи,
КоличествоДТ,
КоличествоКТ,
НДСПродукции,
НомерЖурнала,
Номерстроки,
Организация,
Период,
Регистратор,
Содержание,
СписаниеПартий,
СубконтоДТ,
СубконтоКТ,
Сумма,
СчетДТ,
СчетКТ.

Какие реквизиты строки движения нужно заполнить и как?
---
DreamMaster, ну да, если счет забаланс то 000 не нужен.
(13) DreamMaster, смотрите по этим позициям какой остаток дает запрос и какие ресурсы делает док-корректировка.
---
Вместо
```1c
    Для Каждого Колонка Из Выгрузка.Колонки Цикл

    СтрокаЗаписи[ИмяКолонки]= Стр[Колонка.Имя]; // ВОТ ТУТ ВОПРОС

    КонецЦикла;
```

напиши

```1c
    ЗаполнитьЗначенияСвойств(СтрокаЗаписи, Стр, );
```
---
это не то:
1) В реквизитах присутствует слово "Остаток" (конечно убрать его не проблема, но возникает вопрос 2)
2) Из каких реквизитов запроса взять данные и в какие реквизиты их заполнить?

Мне нужно, чтобы после того, как я создам документ и удалю все движения до даты документа - итоговые данные по регистру не изменились.
---
DreamMaster, запрос делается по регистру, так что имена реквизитов будут идентичны, за исключением ресурсов. В ресурсах придется убрать суффикс "Остаток". Заполни Корректировку и посмотри остатки и обороты на дату проведения. Обороты должны быт равны остаткам на начало, а остатки на конец должны быть в 2 раза больше остатков на начало.
---
В запросе реквизит "счет", в строки записи "СчетДТ" и "СчетКТ". По прежнему остается вопрос: куда именно записывать данные?
---
DreamMaster, думаю запрос будет такой

```1c
    ВЫБРАТЬ
    ТекущийРегистрНакопления.Организация,
    ТекущийРегистрНакопления.Счет,
    ТекущийРегистрНакопления.Субконто1,
    ТекущийРегистрНакопления.Субконто2,
    ТекущийРегистрНакопления.Субконто3,
    ТекущийРегистрНакопления.Валюта,
    ТекущийРегистрНакопления.СуммаОстатокДт,
    ТекущийРегистрНакопления.СуммаОстатокКт,
    ТекущийРегистрНакопления.ВалютнаяСуммаОстатокДт,
    ТекущийРегистрНакопления.ВалютнаяСуммаОстатокКт,
    ТекущийРегистрНакопления.КоличествоОстатокДт,
    ТекущийРегистрНакопления.КоличествоОстатокКт
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаСреза, , , ) КАК ТекущийРегистрНакопления
```

далее идем по выборке запроса и создаем записи в регистре, смотрим если суммаостатокДТ или количествоостатокДТ или валютнаясуммаостатокДТ <> 0
то заполняем строку по ДТ, по КТ будет вспомогательный счет 000
ну и наоборот суммаостатокКТ или количествоостатокКТ или валютнаясуммаостатокКТ <> 0 делаем проводку по КТ, по ДТ будет вспомогательный счет 000
---
ZergKRSK, напиши пожалуйста цикл (полностью код, который должен быть). Для меня все эти счета - дремучий лес.
---
DreamMaster, думаю както так

```1c
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    СтрокаЗаписи.Добавить();
    СтрокаЗаписи.Организация = Выборка.Организация;
    Если Выборка.Счет.Валютный Тогда
    СтрокаЗаписи.Валюта = Выборка.Валюта;
    КонецЕсли;
    Если Выборка.СуммаОстатокДт <> 0 ИЛИ Выборка.ВалютнаяСуммаОстатокДт <> 0 ИЛИ Выборка.КоличествоОстатокДт <> 0 Тогда
    СтрокаЗаписи.СчетДт = Выборка.Счет;
    СтрокаЗаписи.СчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный;
    .... субконто Дт ....
    СтрокаЗаписи.Сумма = Выборка.СуммаОстатокДт;
    СтрокаЗаписи.ВалютнаяСумма = Выборка.ВалютнаяСуммаОстатокДт;
    СтрокаЗаписи.Количество = Выборка.КоличествоОстатокДт;
    КонецЕсли;
```
---
DreamMaster, для ".... субконто дт ...." вот примерный код

```1c
    ВидыСубконтоСчета = СтрокаЗаписи.СчетДт.ВидыСубконто;
    Для а = 1 По ВидыСубконтоСчета.Количество() Цикл
    Если а = 1 Тогда
    СтрокаЗаписи.СубконтоДт.Вставить(ВидыСубконтоСчета[а-1].ВидСубконто, Выборка.Субконто1);
    ИначеЕсли а = 2 Тогда
    СтрокаЗаписи.СубконтоДт.Вставить(ВидыСубконтоСчета[а-1].ВидСубконто, Выборка.Субконто2);
    Иначе
    СтрокаЗаписи.СубконтоДт.Вставить(ВидыСубконтоСчета[а-1].ВидСубконто, Выборка.Субконто3);
    КонецЕсли;
    КонецЦикла;
```
---
ZergKRSK, сделал так:

```1c
    УстановитьЗначенияСубконто(СтрокаЗаписи.СчетДт, СтрокаЗаписи.СубконтоДт, Стр.Субконто1, Стр.Субконто2, Стр.Субконто3)

    Процедура УстановитьЗначенияСубконто(Счет, Субконто, ЗначениеСубконто1, ЗначениеСубконто2, ЗначениеСубконто3)

    Субконто.Очистить();

    Если Не Счет.Пустая() Тогда

    МассивСубконто = Новый Массив;
    МассивСубконто.Добавить(ЗначениеСубконто1);
    МассивСубконто.Добавить(ЗначениеСубконто2);
    МассивСубконто.Добавить(ЗначениеСубконто3);

    Для Сч = 0 По Счет.ВидыСубконто.Количество() - 1 Цикл
    ВидСубконто = Счет.ВидыСубконто[Сч].ВидСубконто;
    Субконто.Вставить(ВидСубконто, ВидСубконто.ТипЗначения.ПривестиЗначение(МассивСубконто[Сч]));
    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры;
```

При попытке проведения документа выдает:
Запись не верна! Корреспонденция между балансовыми и забалансовыми счетами
---
ZergKRSK, вот полный код обработки:

```1c
    Процедура КнопкаВыполнитьНажатие(Кнопка)

    Если НЕ ЗначениеЗаполнено(ДатаСреза) Тогда
    Возврат;
    КонецЕсли;

    //Регистр Хозрасчетный

    ТекРегистр = Метаданные.РегистрыБухгалтерии.Хозрасчетный;

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ТекущийРегистрНакопления.Организация,
    | ТекущийРегистрНакопления.Счет,
    | ТекущийРегистрНакопления.Субконто1,
    | ТекущийРегистрНакопления.Субконто2,
    | ТекущийРегистрНакопления.Субконто3,
    | ТекущийРегистрНакопления.Валюта,
    | ТекущийРегистрНакопления.СуммаОстатокДт КАК СуммаДт,
    | ТекущийРегистрНакопления.СуммаОстатокКт КАК СуммаКт,
    | ТекущийРегистрНакопления.ВалютнаяСуммаОстатокДт КАК ВалютнаяСуммаДт,
    | ТекущийРегистрНакопления.ВалютнаяСуммаОстатокКт КАК ВалютнаяСуммаКт,
    | ТекущийРегистрНакопления.КоличествоОстатокДт КАК КоличествоДт,
    | ТекущийРегистрНакопления.КоличествоОстатокКт КАК КоличествоКт
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаСреза, , , ) КАК ТекущийРегистрНакопления";

    Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ДатаСреза) + 1);

    Выгрузка = Запрос.Выполнить().Выгрузить();
    КолВо = Выгрузка.Количество();
    Н = 1;

    ДокументКорректировки = Документы.КорректировкаЗаписейРегистров.СоздатьДокумент();

    ДокументКорректировки.Дата = КонецДня(ДатаСреза);
    ДокументКорректировки.Комментарий = "Перенос остатков по регистру: " + ТекРегистр.Синоним;

    НоваяСтрока = ДокументКорректировки.ТаблицаРегистровБухгалтерии.Добавить();
    НоваяСтрока.Имя = ТекРегистр.Имя;
    НоваяСтрока.Представление = ТекРегистр.Синоним;

    Для Каждого Стр Из Выгрузка Цикл

    Состояние ("Регистр бухгалтерии: " + ТекРегистр.Синоним + " " + Н + " из " + КолВо);
    Н = Н + 1;

    СтрокаЗаписи = ДокументКорректировки.Движения[ТекРегистр.Имя].Добавить();

    СтрокаЗаписи.Период = КонецДня(ДатаСреза);

    Для Каждого Колонка Из Выгрузка.Колонки Цикл

    ЗаполнитьЗначенияСвойств(СтрокаЗаписи, Стр);

    Если Стр.СуммаДт <> 0 ИЛИ Стр.ВалютнаяСуммаДт <> 0 ИЛИ Стр.КоличествоДт <> 0 Тогда

    Если Стр.Счет.Валютный Тогда
    СтрокаЗаписи.ВалютаДТ = Стр.Валюта;
    КонецЕсли;

    СтрокаЗаписи.СчетДТ = Стр.Счет;
    СтрокаЗаписи.СчетКТ = ПланыСчетов.Хозрасчетный.Вспомогательный;
    СтрокаЗаписи.Сумма = Стр.СуммаДт;
    УстановитьЗначенияСубконто(СтрокаЗаписи.СчетДт, СтрокаЗаписи.СубконтоДт, Стр.Субконто1, Стр.Субконто2, Стр.Субконто3)

    Иначе

    Если Стр.Счет.Валютный Тогда
    СтрокаЗаписи.ВалютаКТ = Стр.Валюта;
    КонецЕсли;

    СтрокаЗаписи.СчетКТ = Стр.Счет;
    СтрокаЗаписи.СчетДТ = ПланыСчетов.Хозрасчетный.Вспомогательный;
    СтрокаЗаписи.Сумма = Стр.СуммаКт;

    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    ДокументКорректировки.Записать();

    Сообщить ("Создан документ: " + ДокументКорректировки);

    КонецПроцедуры

    Процедура УстановитьЗначенияСубконто(Счет, Субконто, ЗначениеСубконто1, ЗначениеСубконто2, ЗначениеСубконто3)

    Субконто.Очистить();

    Если Не Счет.Пустая() Тогда

    МассивСубконто = Новый Массив;
    МассивСубконто.Добавить(ЗначениеСубконто1);
    МассивСубконто.Добавить(ЗначениеСубконто2);
    МассивСубконто.Добавить(ЗначениеСубконто3);

    Для Сч = 0 По Счет.ВидыСубконто.Количество() - 1 Цикл

    ВидСубконто = Счет.ВидыСубконто[Сч].ВидСубконто;
    Субконто.Вставить(ВидСубконто, ВидСубконто.ТипЗначения.ПривестиЗначение(МассивСубконто[Сч]));

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры
```
---
ZergKRSK,
Теоретически все остатки должны были увеличиться на 2, но увы где-то увеличение существенно больше 2.
Где-то есть ошибка =(
Проверяю отчетом "Оборотно-сальдовая ведомость (бух.)
---
Добавил проверку при проставлении вспомогательного счета: Если НЕ Стр.Счет.Забалансовый Тогда проставляем вспомогательный счет. Документ создался, Сейчас проверяю данные
---
DreamMaster, ну да, если счет забаланс то 000 не нужен.
(13) DreamMaster, смотрите по этим позициям какой остаток дает запрос и какие ресурсы делает док-корректировка.
---
ZergKRSK, всё здорово!

Это я изначальные данные в отчете (до формирования корректировки) сформировал на конец текущего года (а срез делаю на конец прошлого).

Сейчас перепроверил данные - по всем организациям увеличение ровно в 2 раза.

Огромное спасибо за помощь!
---
Тема закрыта