Раз в неделю мы с заботой отбираем самые полезные новости для пользователя 1С!

Служба заботы ООО "Инженер-Центр" :)

1С:Программирование Обнуление остатков по счёту или регистру и работа с метаданными, полями выбора.

Волжский

|

Волгоград

|

Камышин

(8442) 23-84-08 mail@ec-1c.ru
Мы на карте 603660307
(84457) 4-25-94 mail@ec-1c.ru
Мы на карте 603660307
Если вы хотите первыми получать наши новости, введите свой e-mail!
Перейти к заказу билетов
29.03.2013

1С:ПРОГРАММИРОВАНИЕ

Обнуление остатков по счёту или регистру и работа с метаданными, полями выбора

 

Написано для студентов проходящих курс 1С-Программирования

 

Задача – простая.

Делается для конфигурации 1С:Бухгалтерии 8.

Делаем для неуправляемой формы.

Нужно обнулить бухгалтерские проводки или остатки по регистру на заданное число.

Берём остатки на конец этого числа и обнуляем их.

То есть, делаем движение по этим остаткам, но со знаком минус.

Сделаем это обработкой.

 

ШАГ 1. Соберем регистры в список.

Укажем в форме обработки Дату Остатков и организацию.

Движения будем помещать в документ «ОперацияБух». В нём можно сделать движения по разным регистрам.

Значит, на форму нужно поместить выбор нужного регистра.

Это лучше сделать списком.

Список заполним из списка возможных движений документа «ОперацияБух».

Как получить список движений документа «ОперацияБух»?

Находим такую штуку:

Метаданные.Документы.ОперацияБух.Движения

В помощи написано:

Коллекция объектов метаданных, описывающих регистры. Для документа это те регистры, по которым документ может выполнять движения.

Проверим:

               ДвижДок = Метаданные.Документы.ОперацияБух.Движения;
               Для Каждого Рег Из ДвижДок Цикл
                               Сообщить("" + Рег);
               КонецЦикла;       

В результате – выдаётся длинный список разных регистров.

Надо бы понять – какой из них какой есть.

Поменяем код:

               ДвижДок = Метаданные.Документы.ОперацияБух.Движения;
               Для Каждого Рег Из ДвижДок Цикл
                               Сообщить("" + Рег.ПолноеИмя());
               КонецЦикла;       

Теперь получаем список всех регистров зацепленных за документ «ОперацияБух».

 

Подвесим на форму элемент формы «СписокДвижений» - типа «Поле Выбора».

Нам надо затолкать список наших регистров в это поле для выбора.

Затолкаем:

ДвижДок = Метаданные.Документы.ОперацияБух.Движения;
Для Каждого Рег Из ДвижДок Цикл
               ЭлементыФормы.СписокДвижений.СписокВыбора.Добавить(Рег);
КонецЦикла;       

 

Мы обратились к свойству (СписокВыбора) этого Поля Выбора. В этот СписокВыбора (у него свойства списка значений) – мы затолкаем элементы нашей коллекции.

 

Теперь при открытии формы нам надо позиционировать список в первую позицию. Чтобы Поле Выбора «СписокДвижений» не было пустым при открытии.

ЭлементыФормы.СписокДвижений.Значение = ЭлементыФормы.СписокДвижений.СписокВыбора[0].Значение; 

Тут надо понимать – с одной стороны в Поле Выбора сидит Список Выбора – в свойстве СписокВыбора. И его мы видим при открытии Поля Выбора.

А с другой стороны на форме отображается то, что затолкали в свойство Значение (этого Поля Выбора). 

 

Итог такой:

Процедура ПриОткрытии()
               // Вставить содержимое обработчика.
               ЭлементыФормы.СписокДвижений.Значение = ЭлементыФормы.СписокДвижений.СписокВыбора[0].Значение;
КонецПроцедуры
 
ДвижДок = Метаданные.Документы.ОперацияБух.Движения;
Для Каждого Рег Из ДвижДок Цикл
               ЭлементыФормы.СписокДвижений.СписокВыбора.Добавить(Рег);
               Сообщить("" + Рег.ПолноеИмя());
КонецЦикла;       
 

ШАГ 2. Оставим себе работу только с Регистрами Накопления – причём только с теми, где есть остатки. И с регистром Бухгалтерского Учёта.

Как походу отличить один регистр от другого?

 

С регистром бухгалтерского учёта – всё просто – он у нас такой один.

Поэтому при заполнении списка, если Рег равен РегистрыБухгалтерии.Хозрасчетный, тогда мы включаем его в список.

Регистры с остатками – это Регистры Накоплений, с ними так же сработаем через Метаданные (с раскраской возникли трудности):

ДвижДок = Метаданные.Документы.ОперацияБух.Движения;
Для Каждого Рег Из ДвижДок Цикл
               Если (Рег = Метаданные.РегистрыБухгалтерии.Хозрасчетный) Тогда
                               ЭлементыФормы.СписокДвижений.СписокВыбора.Добавить(Рег);
                               Сообщить("" + Рег.ПолноеИмя());
                               
               ИначеЕсли Метаданные.РегистрыНакопления.Содержит(Рег) Тогда
                               ЭлементыФормы.СписокДвижений.СписокВыбора.Добавить(Рег);
                               Сообщить("" + Рег.ПолноеИмя());
                               
               КонецЕсли;
КонецЦикла;       
 

Для проверки – кто такой Рег используем Метаданные.РегистрыНакопления.Содержит(Рег)

 

Теперь надо разобраться – это Регистр Накопления с Остатками или с Оборотами?

Надо сначала найти сам объект Регистр, потому что в Рег у нас сидит только его описание.

Находим регистр через его Имя.

ИмяРегистраНакопления = Рег.Имя;
РегистрОбъект = Метаданные.РегистрыНакопления.Найти(ИмяРегистраНакопления);

Теперь можно и к типу регистра подобраться. Вот так:

Если РегистрОбъект.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда

 

В итоге получаем нужные нам регистры для дальнейшей работы:

ДвижДок = Метаданные.Документы.ОперацияБух.Движения;
Для Каждого Рег Из ДвижДок Цикл
               Если (Рег = Метаданные.РегистрыБухгалтерии.Хозрасчетный) Тогда
                               ЭлементыФормы.СписокДвижений.СписокВыбора.Добавить(Рег);
                               Сообщить("" + Рег.ПолноеИмя());
                               
               ИначеЕсли Метаданные.РегистрыНакопления.Содержит(Рег) Тогда
                               ИмяРегистраНакопления = Рег.Имя;
                               РегистрОбъект = Метаданные.РегистрыНакопления.Найти(ИмяРегистраНакопления);
                               Если РегистрОбъект.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
                                    ЭлементыФормы.СписокДвижений.СписокВыбора.Добавить(Рег);
                                    Сообщить("" + Рег.ПолноеИмя());
                               Конецесли;         
                               
               КонецЕсли;
КонецЦикла;       

 

ШАГ 3. ПОЛУЧАЕМ ОСТАТКИ ПО РЕГИСТРАМ.

Теперь нам надо построить запрос для получения остатков.

По регистрам накопления остатки собираются несколько иначе, чем по регистру бухгалтерии.

Поэтому построим, для примера, обычный запрос по остаткам регистра накопления «НДС начисленный»:

Запрос и работа с ним будут выглядеть так:

Процедура КнопкаВыполнитьНажатие(Кнопка)
               // Вставить содержимое обработчика.
               Запрос = Новый Запрос();
               Запрос.Текст = "ВЫБРАТЬ
                              // ЭТО ИЗМЕРЕНИЯ РЕГИСТРА:
                              |               НДСНачисленныйОстатки.Организация,
                              |               НДСНачисленныйОстатки.СчетФактура,
                              |               НДСНачисленныйОстатки.ВидЦенности,
                              |               НДСНачисленныйОстатки.СтавкаНДС,
                              |               НДСНачисленныйОстатки.Покупатель,
                              |               НДСНачисленныйОстатки.ВидНачисления,
                              |               НДСНачисленныйОстатки.ДоговорКонтрагента,
                              |               НДСНачисленныйОстатки.ДатаОплаты,
                              // ЭТО РЕСУРСЫ РЕГИСТРА:
                              |               НДСНачисленныйОстатки.СуммаБезНДСОстаток,
                              |               НДСНачисленныйОстатки.НДСОстаток
                              |ИЗ
                              |               РегистрНакопления.НДСНачисленный.Остатки(&ДатаОстатка, Организация = &Организация) КАК НДСНачисленныйОстатки";
                                                                
               ГраницаОстатков = Новый Граница(КонецДня(ЭлементыФормы.ДатаОстатков.Значение), ВидГраницы.Включая);                                    
               Запрос.УстановитьПараметр("ДатаОстатка", ГраницаОстатков);
               Запрос.УстановитьПараметр("Организация", Организация); 
               ТЗ = Запрос.Выполнить().Выгрузить();
               ТЗ.ВыбратьСтроку();
               //
КонецПроцедуры
 

Во-первых, обращаем внимание на то, как лихо мы получаем Дату остатков – не напрямую, а через Границу.

Смотрим синтаксис-помощник «Работа с запросами – Таблицы запросов – Таблица Регистра накопления – Таблица остатков – Параметры – Период»:

Период (необязательный)

Тип параметра: Дата; МоментВремени; Граница.
Указывается период, на значение которого рассчитываются остатки. Для расчета остатков по значение периода его необходимо задавать объектом Граница с включением граничного значения.
Значение по умолчанию: Если параметр не задан, итоги рассчитываются по самую последнюю запись.

 

Нам нужны остатки на конец дня – ВКЛЮЧАЯ самое последнее мгновение этого дня. Поэтому используем ГРАНИЦА. Если не использовали бы, то записи регистра накопления со временем 23:59:59 могли бы не попасть в наши остатки.

 

Во-вторых, начинаем думать как будем программно формировать строку запроса.

Сначала формируем строки с измерениями,

потом с ресурсами,

потом присобачиваем имя регистра.

Получится как-то так:

Процедура КнопкаВыполнитьНажатие(Кнопка)
               // Вставить содержимое обработчика.
    // Для посматривания
               //////Запрос.Текст = "ВЫБРАТЬ
               //////                                           // ЭТО ИЗМЕРЕНИЯ РЕГИСТРА:
               //////                                           |           НДСНачисленныйОстатки.Организация,
               //////                                           |           НДСНачисленныйОстатки.СчетФактура,
               //////                                           |           НДСНачисленныйОстатки.ВидЦенности,
               //////                                           |           НДСНачисленныйОстатки.СтавкаНДС,
               //////                                           |           НДСНачисленныйОстатки.Покупатель,
               //////                                           |           НДСНачисленныйОстатки.ВидНачисления,
               //////                                           |           НДСНачисленныйОстатки.ДоговорКонтрагента,
               //////                                           |           НДСНачисленныйОстатки.ДатаОплаты,
               //////                                           // ЭТО РЕСУРСЫ РЕГИСТРА:
               //////                                           |           НДСНачисленныйОстатки.СуммаБезНДСОстаток,
               //////                                           |           НДСНачисленныйОстатки.НДСОстаток
               //////                                           |ИЗ
               //////                                           |               РегистрНакопления.НДСНачисленный.Остатки(&ДатаОстатка, Организация = &Организация) КАК НДСНачисленныйОстатки";
               Запрос = Новый Запрос();
               Запрос.Текст = "ВЫБРАТЬ";
               // Достаём из списка метаданные нашего выбранного регистра                                      
               РегистрНАШ = ЭлементыФормы.СписокДвижений.Значение;                                        
               ИмяРегистраНакопления = РегистрНАШ.Имя;
               РегистрОбъектНАШ = Метаданные.РегистрыНакопления.Найти(ИмяРегистраНакопления);
               // Собираем в запрос ИЗМЕРЕНИЯ регистра 
               // Таблицу называем именем нашего регистра
               Для Каждого Измерение ИЗ РегистрОбъектНАШ.Измерения Цикл 
                               Запрос.Текст = Запрос.Текст + "
                               | " + ИмяРегистраНакопления + "." + Измерение.Имя + ",";
               КонецЦикла;                      
               // Собираем в запрос РЕСУРСЫ нашего регистра - к имени ресурса надо прибавлять слово ОСТАТОК
               // Но нам надо, чтобы в результрующей таблице имя ресурса была таким же как оно есть - без слова ОСТАТОК
               // Поэтому используем псевдоним: через КАК даём полю остатков имена ресурсов
               Для Каждого Ресурс ИЗ РегистрОбъектНАШ.Ресурсы Цикл 
                               Запрос.Текст = Запрос.Текст + "
                               | " + ИмяРегистраНакопления + "." + Ресурс.Имя + "Остаток КАК " + Ресурс.Имя + ",";
               КонецЦикла;                      
               // Убираем последнюю запятую из запроса - она лишняя
               Запрос.Текст = Сред(Запрос.Текст, 1, СтрДлина(Запрос.Текст)-1);
               // Указываем Таблицу - Источник запроса
               Запрос.Текст = Запрос.Текст + "
               |ИЗ
               |              РегистрНакопления." + ИмяРегистраНакопления + ".Остатки(&ДатаОстатка, Организация = &Организация) КАК " + ИмяРегистраНакопления;
               
               // Дальше работаем как с обычным запросом
               ГраницаОстатков = Новый Граница(КонецДня(ЭлементыФормы.ДатаОстатков.Значение), ВидГраницы.Включая);                                    
               Запрос.УстановитьПараметр("ДатаОстатка", ГраницаОстатков);
               Запрос.УстановитьПараметр("Организация", Организация);
               ТЗ = Запрос.Выполнить().Выгрузить();
               ТЗ.ВыбратьСтроку();
               //
КонецПроцедуры
 

 

Теперь надо построить запрос для получения остатков по регистру бухгалтерии.

Он строится легко и без всяких ухищрений:

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

Единственное на что стоит обратить внимание – это использование в условии виртуальной таблицы выражения:

Счет.ЗапретитьИспользоватьВПроводках = ЛОЖЬ

Так мы отсекаем те счета, которые не используются в проводках. Обычно это счета-группы.

 

Теперь результаты наших запросов надо запихать в документ «ОперацияБух».

 

 

ШАГ 4. СТОРНИРУЕМ ПОЛУЧЕННЫЕ ОСТАТКИ документом «ОперацияБух».

Чем хорош документ «ОперацияБух»?

Он хорош тем, что не хранит данные для формирования своих движений в своих табличных частях.

Он показывает те движения, которые к нему уже прицеплены.

То есть нам надо просто прицепить к этому документу нужные нам движения.

Создаём пустой документ «ОперацияБух». Записываем его.

Формируем нужные записи по регистру.

И прицепляем эти записи к созданному документу «ОперацияБух». Вот и всё.

Отработаем эту штуку для Регистров Накопления.

 

1. Сначала создадим документ «ОперацияБух» и запишем его.

               ДокОст = Документы.ОперацияБух.СоздатьДокумент();
               ДокОст.Дата = КонецДня(ДатаОстатков);
               ДокОст.Организация = ЭлементыФормы.Организация.Значение; 
               ДокОст.Комментарий = ИмяРегистраНакопления + " - обнуление остатков";
               ДокОст.Содержание  = ИмяРегистраНакопления + " - обнуление остатков";
               //             Надо указать с каким регистром работаем, чтобы отображение шло верно                                                               
               НовСтр               = ДокОст.ТаблицаРегистровНакопления.Добавить();
               НовСтр.Имя           = ИмяРегистраНакопления;
               НовСтр.Представление = РегистрНАШ.Синоним;
               //
               ДокОст.Записать();
 

2. Теперь надо создать набор записей для нашего регистра накопления.

               // Вот так просто по имени можно добраться до нужного регистра
               // Создаём пока пустой набор записей
               НаборЗаписей = РегистрыНакопления[ИмяРегистраНакопления].СоздатьНаборЗаписей();
               // Прицепим этот набор к нашему Документу ОперацияБух
               // ОБЯЗАТЕЛЬНО указываем ССЫЛКУ на документ, а не НА САМ ОБЪЕКТ ДОКУМЕНТ
               НаборЗаписей.Отбор.Регистратор.Установить(ДокОст.Ссылка);

 

3. Теперь подготовим нашу таблицу остатков и запишем её с видом РАСХОД – тогда остатки ОБНУЛЯТСЯ.

               // Для записей нужно поле Период - добавим его в таблицу:
               ТЗ.Колонки.Добавить("Период");
               // Установим нужное нам значение колонки Период датой нашего документа остатков
               ТЗ.ЗаполнитьЗначения(ДокОст.Дата, "Период");
               // Для записей регистра надо указать - это какое движение ПРИХОД или РАСХОД
               ТЗ.Колонки.Добавить("ВидДвижения");
               // заполним Вид Движения значением РАСХОД (используем системное перечисление ВидДвиженияНакопления.Расход)
               ТЗ.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход, "ВидДвижения");
               // Загрузим в набор записей 
               НаборЗаписей.Загрузить(ТЗ);
               НаборЗаписей.Записать();
               Сообщить("Записан документ "  + ДокОст + " для обнуления остатков Регистра Накопления " + ИмяРегистраНакопления);

 

Отработаем ту же процедуру для Регистра Бухгалтерского Учёта.

Здесь будет немного сложнее.

1. Надо добавить в запрос определение вида счета – Активный, Пассивный или Активно-Пассивный.

2. Надо сделать отбор по счёту обнуления остатков – может быть появится желание обнулить только конкретный счёт. Добавим поле ввода «ВыбСчет» (тип ПланыСчетов.Хозрасчетный) на форму.

При открытии формы будем закрывать доступ к этому полю:

ЭлементыФормы.ВыбСчет.Доступность = Ложь;

 

Сделаем его активным, только если выбран регистр бухгалтерского учёта:

Процедура СписокДвиженийПриИзменении(Элемент)
               // Вставить содержимое обработчика.
               Если ЭлементыФормы.СписокДвижений.Значение = Метаданные.РегистрыБухгалтерии.Хозрасчетный Тогда
                               ЭлементыФормы.ВыбСчет.Доступность = Истина;
               КонецЕсли;         
               
КонецПроцедуры

 

В итоге запрос по остаткам бухгалтерских счетов будет выглядеть так:

               // Теперь отработаем остатки по регистру бухгалтерия
               Запрос = Новый Запрос;
               Запрос.Текст = "ВЫБРАТЬ
                              |               ХозрасчетныйОстатки.Организация,
                              |               ХозрасчетныйОстатки.Счет КАК Счет,
                              |               ХозрасчетныйОстатки.Счет.Вид КАК СчетВидАктивности,
                              |               ХозрасчетныйОстатки.Счет.Код КАК СчетКод,
                              |               ХозрасчетныйОстатки.Подразделение,
                              |               ХозрасчетныйОстатки.Субконто1,
                              |               ХозрасчетныйОстатки.Субконто2,
                              |               ХозрасчетныйОстатки.Субконто3,
                              |               ХозрасчетныйОстатки.СуммаОстаток,
                              |               ХозрасчетныйОстатки.КоличествоОстаток
                              |ИЗ
                              |               РегистрБухгалтерии.Хозрасчетный.Остатки(
                              |                                             &Период,
                              |                                             Счет.ЗапретитьИспользоватьВПроводках = ЛОЖЬ
                              |                                                            И (Счет = &ВыбСчет
                              |                                                                            ИЛИ &ВыбСчет = НЕОПРЕДЕЛЕНО),
                              |                                             ,
                              |                                             Организация = &Организация) КАК ХозрасчетныйОстатки
                              |
                              |УПОРЯДОЧИТЬ ПО
                              |               СчетКод"; 
               Запрос.УстановитьПараметр("Период", Новый Граница(КонецДня(ДатаОстатков), ВидГраницы.Включая));
               Запрос.УстановитьПараметр("Организация", Организация);
               Запрос.УстановитьПараметр("ВыбСчет", ?(ЗначениеЗаполнено(Выбсчет), ВыбСчет, НЕОПРЕДЕЛЕНО));
               ТЗ = Запрос.Выполнить().Выгрузить();
               ТЗ.ВыбратьСтроку("Бухгалтерские Счета");
 

Если счёт Активный, тогда будем делать проводку по Дебету этого счёта, с аналитикой остатка и со сменой знака количественного и суммового остатка. По кредиту будет счет 000.

Если счёт Пассивный, тогда будем делать проводку по Кредиту этого счёта, с аналитикой остатка и со сменой знака количественного и суммового остатка. По Дебету будет счет 000.

Если счёт Активно-Пассивный тогда всё сложно.

Если СуммаОстаток > 0, тогда кидаем всё на дебет, но меняем знак у суммы и у количества. Делаем сторно.

Если СуммаОстаток < 0, тогда кидаем всё на кредит и не меняем знак у суммы и у количества.

Для обнуления нужного бухгалтерского счёта получим такую программу:

// Теперь отработаем остатки по регистру бухгалтерия
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |               ХозрасчетныйОстатки.Организация,
               |               ХозрасчетныйОстатки.Счет КАК Счет,
               |               ХозрасчетныйОстатки.Счет.Вид КАК СчетВидАктивности,
               |               ХозрасчетныйОстатки.Счет.Код КАК СчетКод,
               |               ХозрасчетныйОстатки.Счет.Количественный,
               |               ХозрасчетныйОстатки.Подразделение,
               |               ХозрасчетныйОстатки.Субконто1,
               |               ХозрасчетныйОстатки.Субконто2,
               |               ХозрасчетныйОстатки.Субконто3,
               |               ХозрасчетныйОстатки.СуммаОстаток,
               |               ХозрасчетныйОстатки.КоличествоОстаток
               |ИЗ
               |               РегистрБухгалтерии.Хозрасчетный.Остатки(
               |                                             &Период,
               |                                             Счет.ЗапретитьИспользоватьВПроводках = ЛОЖЬ
               |                                                            И (Счет = &ВыбСчет
               |                                                                            ИЛИ &ВыбСчет = НЕОПРЕДЕЛЕНО),
               |                                             ,
               |                                             Организация = &Организация) КАК ХозрасчетныйОстатки
               |
               |УПОРЯДОЧИТЬ ПО
               |               СчетКод"; 
Запрос.УстановитьПараметр("Период", Новый Граница(КонецДня(ДатаОстатков), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ВыбСчет", ?(ЗначениеЗаполнено(Выбсчет), ВыбСчет, НЕОПРЕДЕЛЕНО));
Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Бухгалтерские Счета");
//////////////////////////////////////////
ДокОст.Комментарий = "Регистр Бухгалтерии Хозрасчетный  - обнуление остатков";
ДокОст.Содержание  = "Регистр Бухгалтерии Хозрасчетный  - обнуление остатков";
//
ДокОст.Записать();
/////////////////////////////////////////                    
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
// Прицепим этот набор к нашему Документу ОперацияБух
// ОБЯЗАТЕЛЬНО указываем ССЫЛКУ на документ, а не НА САМ ОБЪЕКТ ДОКУМЕНТ
НаборЗаписей.Отбор.Регистратор.Установить(ДокОст.Ссылка);
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
               // Эти поля записей регистра мы заполняем одинаково
               НоваяЗапись = НаборЗаписей.Добавить();
               НоваяЗапись.Организация = Выборка.Организация;
               НоваяЗапись.Активность = ИСТИНА;
               НоваяЗапись.Период = ДокОст.Дата;
               // Для Актвного Счёта и Активно-Пассивного - если Остаок суммы больше либо равен 0
               Если (Выборка.СчетВидАктивности = ВидСчета.Активный) ИЛИ 
                               (Выборка.СчетВидАктивности = ВидСчета.АктивноПассивный И Выборка.СуммаОстаток>=0) Тогда
                               НоваяЗапись.СчетДт = Выборка.Счет;
                               НоваяЗапись.ПодразделениеДт = Выборка.Подразделение;
                               // Кредит - счет 000
                               НоваяЗапись.СчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный;
                               // Работаем по субконто
                               НомерСубконто = 0;
                               Для Каждого ТекВидСубконто ИЗ Выборка.Счет.ВидыСубконто Цикл
                                              НомерСубконто = НомерСубконто + 1;
                                              // Как лихо можно подобраться к полю запроса в Выборке!
                                              // Просто как к члену массива!
                                              ТекСубконто   = Выборка["Субконто" + Строка(НомерСубконто)];
                                              Если ЗначениеЗаполнено(ТекСубконто) Тогда
                                                             // Сразу указываем вид субконто - позиционируемся на нём 
                                                             // И сразу присваиваем субконто значение
                                                             НоваяЗапись.СубконтоДт[ТекВидСубконто.ВидСубконто] = ТекСубконто;
                                              КонецЕсли;         
                               КонецЦикла;
                               НоваяЗапись.КоличествоДт = (-1)*Выборка.КоличествоОстаток;
                               НоваяЗапись.Сумма        = (-1)*Выборка.СуммаОстаток;
                               
                               // Для Пассивного счета и Активно-Пассивного - если Остаток Суммы меньше 0   
               ИначеЕсли (Выборка.СчетВидАктивности = ВидСчета.Пассивный) ИЛИ 
                               (Выборка.СчетВидАктивности = ВидСчета.АктивноПассивный И Выборка.СуммаОстаток<0) Тогда
                               // Дебет - счет 000
                               НоваяЗапись.Счетдт = ПланыСчетов.Хозрасчетный.Вспомогательный;
                               //
                               НоваяЗапись.СчетКт = Выборка.Счет;
                               НоваяЗапись.ПодразделениеКт = Выборка.Подразделение;
                               // Работаем по субконто
                               НомерСубконто = 0;
                               Для Каждого ТекВидСубконто ИЗ Выборка.Счет.ВидыСубконто Цикл
                                              НомерСубконто = НомерСубконто + 1;
                                              // Как лихо можно подобраться к полю запроса в Выборке!
                                              // Просто как к члену массива!
                                              ТекСубконто   = Выборка["Субконто" + Строка(НомерСубконто)];
                                              Если ЗначениеЗаполнено(ТекСубконто) Тогда
                                                             // Сразу указываем вид субконто - позиционируемся на нём 
                                                             // И сразу присваиваем субконто значение
                                                             НоваяЗапись.СубконтоКт[ТекВидСубконто.ВидСубконто] = ТекСубконто;
                                              КонецЕсли;         
                               КонецЦикла;
                               НоваяЗапись.КоличествоКт = Выборка.КоличествоОстаток;
                               НоваяЗапись.Сумма        = Выборка.СуммаОстаток;
                               
               КонецЕсли;                                                       
               
КонецЦикла;       
НаборЗаписей.Записать();
Сообщить("Записан документ "  + ДокОст + " для обнуления остатков Регистр Бухгалтерии Хозрасчетный");
 

 

Собственно – это всё по этому вопросу.

 

 

Инженер-Центр:

http://ec-1c.ru/

http://инженер-центр.рф/

 


Возврат к списку