1С Предприятие 8. Редактирование проводок без перепроведения документов. Перенос проводок из одной базы 1С в другую.

Аватар пользователя mykib.org
Файлы для скачивания: 

Недавно возник вопрос у бухгалтера отредактировать в Бухгалтерия 8 проводки документа «Закрытие месяца» в закрытом периоде без проведения. Давайте вместе создадим обработку, при помощи которой можно не только редактировать проводки любого документа без перепроведения, причем с возможностью откатить изменения назад, но и переносить эти проводки из одной базы в другую. Можно скачать готовую обработку в этой публикации.

Создадим новую обработку, разместим на основной форме следующие реквизиты формы:

  • ДокСсылка, тип ДокументСсылка
  • ТабличнаяЧастьПроводок, тип ТаблицаЗначений

Добавим кнопки:

  • «Заполнить таблицу по проводкам» - процедура нажатия ЗаполнитьПоПроводкамНажатие(). Для заполнения табличной части проводками, которую можно отредактировать таким образом, каким мы хотим видеть наши проводки
  • «Выгрузить таблицу проводок в файл» - процедура нажатия КнопкаВыгрузитьТаблицуПроводокВФайлНажатие (). Для резервного сохранения проводок, либо для выгрузки их в другую базу
  • «Загрузить таблицу проводок из файла» - процедура нажатия КнопкаЗагрузитьТаблицуПроводокИзФайлаНажатие (). Для возможности отката проводок назад, либо для загрузки их в другую базу
  • «Сформировать проводки к документу» - процедура нажатия КнопкаСформироватьПроводкиКДокументуНажатие (). Формирование проводок к документу из отредактированной табличной части (либо загруженной данными из базы преемника)

Примерно как на рисунке:

Вот реквизиты формы:

При нажатии на кнопку «Заполнить таблицу по проводкам» мы заполняем табличную часть обработки проводками выбранного документа (любого типа):

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

Так как мы не знаем какие колонки будут (например, какое количество субконто), то не забываем программно создать колонки таблицы значений на форме

ЭлементыФормы.ТабличнаяЧастьПроводок.СоздатьКолонки();

Теперь мы можем отредактировать проводки в табличной части обработки и выгрузить из в файл переноса (я придумал для него расширение *.lvv, вы можете использовать любое другое), то используем кнопку «Выгрузить таблицу проводок в файл»:

Процедура КнопкаВыгрузитьТаблицуПроводокВФайлНажатие(Элемент)
	ИмяФайла = "";
	ИмяПути = "";
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.ПолноеИмяФайла = ИмяФайла;
	Диалог.Каталог = ИмяПути;
	Диалог.Заголовок = "Укажите файл для выгрузки";
	Диалог.Фильтр = "Файлы выгрузок проводок (*.lvv)|*.lvv|Все файлы (*.*)|*.*";
	Диалог.Расширение = "lvv";
	Если Диалог.Выбрать() Тогда
                ИмяФайла = Диалог.ПолноеИмяФайла;
	        ИмяПути = Диалог.Каталог;
	КонецЕсли;
	ЗначениеВФайл(ИмяФайла, ТабличнаяЧастьПроводок);
КонецПроцедуры

Либо мы можем отредактировать проводки в табличной части обработки и «привязать» их к документу кнопкой «Сформировать проводки к документу»:

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

// Процедура устанавливает субконто на счете. Если такое субконто на счете
// отсутствует, то ничего не делается.
//
// Параметры:
//		Счет - Счет, к которому относится субконто
//      Субконто - набор субконто
//		Номер или имя установливаемого субконто
//      Значение субконто - значение устанавливаемого субконто
//
Процедура УстановитьЗначениеСубконто(Счет, Субконто, ИмяСубконто, ЗначениеСубконто)

	Если Счет = Неопределено ИЛИ Счет.Пустая() Тогда
		Возврат;
	КонецЕсли;

    ВидыСубконтоСчета = Счет.ВидыСубконто;
	
	Если ТипЗнч(ИмяСубконто) = Тип("Число") Тогда

		Если ИмяСубконто > ВидыСубконтоСчета.Количество() Тогда
			Возврат;
		КонецЕсли;

		ВидСубк = ВидыСубконтоСчета[ИмяСубконто - 1].ВидСубконто;

	Иначе

		ВидСубк = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные[ИмяСубконто];

		Если ВидыСубконтоСчета.Найти(ВидСубк) = Неопределено Тогда
			Возврат;
		КонецЕсли;

	КонецЕсли;

	Субконто.Вставить(ВидСубк, ЗначениеСубконто);


КонецПроцедуры // УстановитьСубконто()


Замечание -

Метаданные.РегистрыБухгалтерии.Хозрасчетный.ПланСчетов.МаксКоличествоСубконто

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

Для загрузки в другую базу воспользуемся кнопкой «Загрузить таблицу проводок из файла»:

Процедура КоманднаяПанель2ДобавитьИзФайла(Кнопка)
	ТЗ = ТабличнаяЧастьПроводок.Выгрузить();
	ИмяФайла = "";
	ИмяПути = "";
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.ПолноеИмяФайла = ИмяФайла;
    Диалог.Каталог = ИмяПути;
    Диалог.Заголовок = "Укажите файл для загрузки";
    Диалог.Фильтр = "Файлы выгрузок проводок (*.lvv)|*.lvv|Все файлы (*.*)|*.*";
    Диалог.Расширение = "lvv";
    Если Диалог.Выбрать() Тогда
        ИмяФайла = Диалог.ПолноеИмяФайла;
        ИмяПути = Диалог.Каталог;
	КонецЕсли;
	ТабличнаяЧастьПроводок.Загрузить(ЗначениеИзФайла(ИмяФайла));
	Для Каждого Стр Из ТЗ Цикл
		НовСтр = ТабличнаяЧастьПроводок.Добавить();
		ЗаполнитьЗначенияСвойств(НовСтр, Стр);
	КонецЦикла;
КонецПроцедуры

Для отката нажмем кнопку «Загрузить таблицу проводок из файла», затем «Сформировать проводки к документу»

Ну и еще. Для управления видимостью, доступностью элементов формы:

Процедура ОбновлениеОтображения()
	
	ЭлементыФормы.ЗаполнитьПоПроводкам.Доступность = ЗначениеЗаполнено(ДокСсылка);
	ЭлементыФормы.КнопкаВыгрузитьТаблицуПроводокВФайл.Доступность = (ТабличнаяЧастьПроводок.Количество() > 0);
	ЭлементыФормы.КнопкаСформироватьПроводкиКДокументу.Доступность = ЗначениеЗаполнено(ДокСсылка);
	
КонецПроцедуры