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