Недавно возник вопрос у бухгалтера отредактировать в 1С [1] Бухгалтерия 8 проводки документа «Закрытие месяца» в закрытом периоде без проведения. Давайте вместе создадим обработку [1], при помощи которой можно не только редактировать проводки любого документа без перепроведения, причем с возможностью откатить изменения назад, но и переносить эти проводки из одной базы 1С [1] в другую. Можно скачать готовую обработку [1] в этой публикации.
Создадим новую обработку [1], разместим на основной форме следующие реквизиты формы:
Добавим кнопки:
Примерно как на рисунке:
Вот реквизиты формы:
При нажатии на кнопку «Заполнить таблицу по проводкам» мы заполняем табличную часть обработки проводками выбранного документа (любого типа):
Процедура ЗаполнитьПоПроводкамНажатие(Элемент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | * |ИЗ | РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, , Регистратор = &Регистратор, , ) КАК ХозрасчетныйДвиженияССубконто |ГДЕ | ХозрасчетныйДвиженияССубконто.Регистратор = &Регистратор"; Запрос.УстановитьПараметр("Регистратор", ДокСсылка); ТабличнаяЧастьПроводок = Запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТабличнаяЧастьПроводок.СоздатьКолонки(); КонецПроцедуры
Так как мы не знаем какие колонки будут (например, какое количество субконто), то не забываем программно создать колонки таблицы значений на форме
ЭлементыФормы.ТабличнаяЧастьПроводок.СоздатьКолонки();
Теперь мы можем отредактировать проводки в табличной части обработки и выгрузить из в файл переноса (я придумал для него расширение *.lvv, вы можете использовать любое другое), то используем кнопку «Выгрузить таблицу проводок в файл»:
Процедура КнопкаВыгрузитьТаблицуПроводокВФайлНажатие(Элемент) ИмяФайла = ""; ИмяПути = ""; Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); Диалог.ПолноеИмяФайла = ИмяФайла; Диалог.Каталог = ИмяПути; Диалог.Заголовок = "Укажите файл для выгрузки"; Диалог.Фильтр = "Файлы выгрузок проводок (*.lvv)|*.lvv|Все файлы (*.*)|*.*"; Диалог.Расширение = "lvv"; Если Диалог.Выбрать() Тогда ИмяФайла = Диалог.ПолноеИмяФайла; ИмяПути = Диалог.Каталог; КонецЕсли; ЗначениеВФайл(ИмяФайла, ТабличнаяЧастьПроводок); КонецПроцедуры
Либо мы можем отредактировать проводки в табличной части обработки и «привязать» их к документу кнопкой «Сформировать проводки к документу»:
Процедура КнопкаСформироватьПроводкиКДокументуНажатие(Элемент) Если ДокСсылка.Проведен Тогда Проводки = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); Проводки.Отбор.Регистратор.Установить(ДокСсылка); Для Каждого Стр Из ТабличнаяЧастьПроводок Цикл НовПроводка = Проводки.Добавить(); ЗаполнитьЗначенияСвойств(НовПроводка, Стр); Для Сч = 1 По Метаданные.РегистрыБухгалтерии.Хозрасчетный.ПланСчетов.МаксКоличествоСубконто Цикл Если ЗначениеЗаполнено(Стр["СубконтоДт" + Сч]) Тогда УстановитьЗначениеСубконто(НовПроводка.СчетДт, НовПроводка.СубконтоДт, Сч, Стр["СубконтоДт" + Сч]); КонецЕсли; Если ЗначениеЗаполнено(Стр["СубконтоКт" + Сч]) Тогда УстановитьЗначениеСубконто(НовПроводка.СчетКт, НовПроводка.СубконтоКт, Сч, Стр["СубконтоКт" + Сч]); КонецЕсли; КонецЦикла; КонецЦикла; Проводки.Записать(); Иначе Сообщить("Нельзя сформировать проводки по непроведенному документу!") КонецЕсли; КонецПроцедуры // Процедура устанавливает субконто на счете. Если такое субконто на счете // отсутствует, то ничего не делается. // // Параметры: // Счет - Счет, к которому относится субконто // Субконто - набор субконто // Номер или имя установливаемого субконто // Значение субконто - значение устанавливаемого субконто // Процедура УстановитьЗначениеСубконто(Счет, Субконто, ИмяСубконто, ЗначениеСубконто) Если Счет = Неопределено ИЛИ Счет.Пустая [2]() Тогда Возврат; КонецЕсли; ВидыСубконтоСчета = Счет.ВидыСубконто; Если ТипЗнч(ИмяСубконто) = Тип("Число") Тогда Если ИмяСубконто > ВидыСубконтоСчета.Количество() Тогда Возврат; КонецЕсли; ВидСубк = ВидыСубконтоСчета[ИмяСубконто - 1].ВидСубконто; Иначе ВидСубк = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные[ИмяСубконто]; Если ВидыСубконтоСчета.Найти(ВидСубк) = Неопределено Тогда Возврат; КонецЕсли; КонецЕсли; Субконто.Вставить(ВидСубк, ЗначениеСубконто); КонецПроцедуры // УстановитьСубконто()
Замечание -
Метаданные.РегистрыБухгалтерии.Хозрасчетный.ПланСчетов.МаксКоличествоСубконто
- для определения максимального количества субконто установленное в базе
Для загрузки в другую базу воспользуемся кнопкой «Загрузить таблицу проводок из файла»:
Процедура КоманднаяПанель2ДобавитьИзФайла(Кнопка) ТЗ = ТабличнаяЧастьПроводок.Выгрузить(); ИмяФайла = ""; ИмяПути = ""; Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.ПолноеИмяФайла = ИмяФайла; Диалог.Каталог = ИмяПути; Диалог.Заголовок = "Укажите файл для загрузки"; Диалог.Фильтр = "Файлы выгрузок проводок (*.lvv)|*.lvv|Все файлы (*.*)|*.*"; Диалог.Расширение = "lvv"; Если Диалог.Выбрать() Тогда ИмяФайла = Диалог.ПолноеИмяФайла; ИмяПути = Диалог.Каталог; КонецЕсли; ТабличнаяЧастьПроводок.Загрузить(ЗначениеИзФайла(ИмяФайла)); Для Каждого Стр Из ТЗ Цикл НовСтр = ТабличнаяЧастьПроводок.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр, Стр); КонецЦикла; КонецПроцедуры
Для отката нажмем кнопку «Загрузить таблицу проводок из файла», затем «Сформировать проводки к документу»
Ну и еще. Для управления видимостью, доступностью элементов формы:
Процедура ОбновлениеОтображения() ЭлементыФормы.ЗаполнитьПоПроводкам.Доступность = ЗначениеЗаполнено(ДокСсылка); ЭлементыФормы.КнопкаВыгрузитьТаблицуПроводокВФайл.Доступность = (ТабличнаяЧастьПроводок.Количество() > 0); ЭлементыФормы.КнопкаСформироватьПроводкиКДокументу.Доступность = ЗначениеЗаполнено(ДокСсылка); КонецПроцедуры
Ссылки
[1] https://www.mykib.org/article/den-devyatyy-integriroval-samyy-bolshoy-katalog-razrabotok-dlya-platformy-1s
[2] https://www.mykib.org/article/1s-8-pustaya-ssylka-v-zaprose-nedokumentirovannaya-vozmozhnost
[3] https://www.mykib.org/tags/1s-8
[4] https://www.mykib.org/tags/razrabotki-i-ishodniki
[5] https://www.mykib.org/sites/default/files/downloads/perenosredaktirovanieprovodok.zip