Публикация поможет в разработке обработки для загрузки в документ "Прочие расходы" данных из файла Excel. По сути саму обработку можно разделить на несколько этапов.
1. Создание внешней обработки с видом Заполнение ТЧ
2. Загрузка и чтение файла эксель
3. Заполнение документа
1. Создание внешней обработки с видом Заполнение ТЧ
Начнем с модуля обработки. Укажем сведения о внешней обработки. Используем модуль БСП для вызова конструктора для регистрации обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
ПараметрыРегистрации.Информация = НСтр("ru = 'Загрузка прочих расходов'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Назначение.Добавить("Документ.ПрочиеДоходыРасходы");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Загрузка прочих расходов'");
Команда.Идентификатор = "ЗагрузкаПрочихРасходов";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Далее всю разработку будем вести в форме обработки.
Для целей отладки обработки добавим 1 реквизит Ссылка и создадим основную форму обработки
Добавим форму обработки.

Уже на данном этапе, если подгрузить обработку в базу, у нас появится кнопка в документе. При нажатии на данную кнопку у нас откроется форма обработки.

2. Загрузка и чтение файла эксель
Давайте теперь реализуем программный код по загрузке из файла Excel и подготовки таблицы для заполнения документа.
Добавим событие ПриОткрытии
Владельцем нашей формы будет форма открытого документа. Для целей дальнейшей отладки формы добавим, что если владелец формы неопределен, то код по формированию диалога открытия файла не будет формироваться.
В конце процедуры укажем Отказ = Истина. Это значит, что сама форма обработки не будет показана пользователю.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЭтотОбъект.ВладелецФормы = Неопределено Тогда
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура("ВладелецФормы", ЭтотОбъект.ВладелецФормы);
Обработчик = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл для загрузки данных резерва ОС'");
ПараметрыЗагрузки.Диалог.Фильтр = НСтр(
"ru='Файл Excel (*.xls;*.xlsx)|*.xls;*.xlsx'");
ПараметрыЗагрузки.Диалог.ПредварительныйПросмотр = Ложь;
ПараметрыЗагрузки.Диалог.ИндексФильтра = 1;
ПараметрыЗагрузки.Диалог.ПроверятьСуществованиеФайла = Истина;
ФайловаяСистемаКлиент.ЗагрузитьФайл(Обработчик, ПараметрыЗагрузки);
Отказ = Истина;
КонецПроцедуры
При открытии формы у нас будет формироваться диалог для загрузки файла Excel.
Далее накидаем процедуры по чтению файла и формированию таблицы с данными для загрузки.
&НаКлиенте
Процедура ВыборФайлаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ЗагрузитьФайл(Результат, ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайл(ДанныеФайла, ДополнительныеПараметры) Экспорт
ФормаДокумента = Неопределено;
ОбъектДокумента = Неопределено;
//++ Для отладки
Если ДополнительныеПараметры = Неопределено Тогда
ФормаДокумента = ПолучитьФорму("Документ.ПрочиеДоходыРасходы.ФормаОбъекта", Новый Структура("Ключ", Объект.Ссылка));
ФормаДокумента.Открыть();
ОбъектДокумента = ФормаДокумента.Объект;
Иначе//--Для отладки
ФормаДокумента = ДополнительныеПараметры.ВладелецФормы;
ОбъектДокумента = ФормаДокумента.Объект;
КонецЕсли;
ПутьНастройки = "НастройкаСчетовУчета";
ДанныеНастройкиСчетовУчета = ОбщегоНазначенияУТКлиентСервер.ПолучитьДанныеМеханизмаИзКэшаФормы(ФормаДокумента, ПутьНастройки);
ЗаполнитьДокументНаСервере(ДанныеФайла, ОбъектДокумента, ДанныеНастройкиСчетовУчета);
ФормаДокумента.КэшДанныхМеханизмов[ПутьНастройки] = ДанныеНастройкиСчетовУчета;
ДоходыИРасходыКлиентСервер.СтатьяАналитикаДоходовРасходовПриИзменении(ФормаДокумента, ПутьНастройки);
Если ФормаДокумента <> Неопределено Тогда
КопироватьДанныеФормы(ОбъектДокумента, ФормаДокумента.Объект);
ФормаДокумента.Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(ДанныеФайла, ОбъектДокумента, ДанныеНастройкиСчетовУчета)
ТаблицаДляЗаполнения = ПрочитатьФайлВТаблицу(ДанныеФайла);
ЗаполнитьТабличнуюЧасть(ТаблицаДляЗаполнения, ОбъектДокумента, ДанныеНастройкиСчетовУчета);
КонецФункции
&НаСервере
Функция ПрочитатьФайлВТаблицу(ДанныеФайла)
ТабличныйДокумент = Новый ТабличныйДокумент;
Расширение = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ДанныеФайла.Имя);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.Хранение);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
ТаблицаДляЗаполнения = Новый ТаблицаЗначений;
ТаблицаДляЗаполнения.Колонки.Добавить("Подразделение", ОбщегоНазначения.ОписаниеТипаСтрока(50));
ТаблицаДляЗаполнения.Колонки.Добавить("ПодразделениеНаименование", ОбщегоНазначения.ОписаниеТипаСтрока(150));
ТаблицаДляЗаполнения.Колонки.Добавить("СтатьяЗатрат", ОбщегоНазначения.ОписаниеТипаСтрока(50));
ТаблицаДляЗаполнения.Колонки.Добавить("Сумма", ОбщегоНазначения.ОписаниеТипаЧисло(15,2));
ТаблицаДляЗаполнения.Колонки.Добавить("СуммаБУ", ОбщегоНазначения.ОписаниеТипаЧисло(15,2));
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Подразделение = ТабличныйДокумент.Область(НомерСтроки, 1).Текст;
СтатьяЗатрат = ТабличныйДокумент.Область(НомерСтроки, 3).Текст;
Если Не ЗначениеЗаполнено(Подразделение) Или Не ЗначениеЗаполнено(СтатьяЗатрат) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТаблицаДляЗаполнения.Добавить();
НоваяСтрока.Подразделение = Подразделение;
НоваяСтрока.ПодразделениеНаименование = ТабличныйДокумент.Область(НомерСтроки, 2).Текст;
НоваяСтрока.СтатьяЗатрат = СтатьяЗатрат;
НоваяСтрока.Сумма = ТабличныйДокумент.Область(НомерСтроки, 4).Текст;
НоваяСтрока.СуммаБУ = ТабличныйДокумент.Область(НомерСтроки, 5).Текст;
КонецЦикла;
УдалитьФайлы(ИмяВременногоФайла);
Возврат ТаблицаДляЗаполнения;
КонецФункции
Подробнее хотел рассказать про процедуру ЗагрузитьФайл
Здесь в дополнительных параметрах приходит Форма документа. Чтобы заполнить настройки счетов учета и сформировать корректные надписи с настройкой счетов учета, нам необходимо выгрузить из кэша формы Структуру с данными настройки счетов учета.
ПутьНастройки = "НастройкаСчетовУчета";
ДанныеНастройкиСчетовУчета = ОбщегоНазначенияУТКлиентСервер.ПолучитьДанныеМеханизмаИзКэшаФормы(ФормаДокумента, ПутьНастройки);
Данную структуру мы заполним на сервере, а потом вернем на форму и обновим настройки отображени
ФормаДокумента.КэшДанныхМеханизмов[ПутьНастройки] = ДанныеНастройкиСчетовУчета;
ДоходыИРасходыКлиентСервер.СтатьяАналитикаДоходовРасходовПриИзменении(ФормаДокумента, ПутьНастройки);
3. Заполнение формы документа
Осталось заполнить саму табличную часть.
Без нюансов как всегда не обошлось. На форме документа формируются гиперссылки с описанием настройки. На самом деле сама настройка представляет из себя ссылку на справочник НастройкиСчетовУчетаПрочихОпераций. При чем пока документ не записан с данными настройками, то сами ссылки на справочник не созданы. И еще такой нюанс, что справочник привязан к самому документу через реквизит ВладелецНастройки. Тут конечно вопрос к 1С... Зачем генерировать новые ссылки на справочник с одинаковыми настройками? Ну хотя бы в документе не создается несколько ссылок.
&НаСервере
Процедура ЗаполнитьТабличнуюЧасть(ТаблицаДляЗаполнения, ОбъектДокумента, ДанныеНастройкиСчетовУчета)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Подразделение КАК Подразделение,
| Таблица.ПодразделениеНаименование КАК ПодразделениеНаименование,
| Таблица.СтатьяЗатрат КАК СтатьяЗатрат,
| Таблица.Сумма КАК Сумма,
| Таблица.СуммаБУ КАК СуммаБУ
|ПОМЕСТИТЬ Т
|ИЗ
| &Таблица КАК Таблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Т.Подразделение КАК ПодразделениеКод,
| Т.ПодразделениеНаименование КАК ПодразделениеНаименование,
| Т.СтатьяЗатрат КАК СтатьяЗатратКод,
| Т.Сумма КАК Сумма,
| Т.СуммаБУ КАК СуммаБУ,
| СтатьиРасходов.Ссылка КАК СтатьяРасходов,
| СтруктураПредприятия.Ссылка КАК Подразделение
|ИЗ
| Т КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтруктураПредприятия КАК СтруктураПредприятия
| ПО Т.Подразделение = СтруктураПредприятия.Код
| ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СтатьиРасходов КАК СтатьиРасходов
| ПО Т.СтатьяЗатрат = СтатьиРасходов.Код";
Запрос.УстановитьПараметр("Таблица", ТаблицаДляЗаполнения);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СтатьяАктивовПассивов = ПланыВидовХарактеристик.СтатьиАктивовПассивов.НайтиПоНаименованию("Резерв под демонтаж ОС");
ПараметрыНастройки = НастройкаСчетовУчетаКлиентСервер.СоставНастройкиСчетовУчета();
ПараметрыНастройки.СчетУчета = ПланыСчетов.Хозрасчетный.РезервыПредстоящихРасходовПрочие;//96.09;
ПараметрыНастройки.Субконто1 = Справочники.Резервы.НайтиПоНаименованию("Резерв на демонтаж и вывод ОС из эксплуатации");//Субконто1;
ПараметрыНастройки.Вставить("НастройкаСчетовУчета", "НастройкаСчетовУчета");
Пока Выборка.Следующий() Цикл
Если Не ЗначениеЗаполнено(Выборка.Подразделение) Тогда
ТекстСообщения = СтрШаблон("Подразделение %1 не найдено по коду %2",
Выборка.ПодразделениеНаименование, Выборка.ПодразделениеКод);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(Выборка.СтатьяРасходов) Тогда
ТекстСообщения = СтрШаблон("Статья расходов не найдена по коду %1",
Выборка.СтатьяЗатратКод);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Продолжить;
КонецЕсли;
НастройкаСчетовУчета = НастройкаСчетовУчетаСлужебныйВызовСервера.СсылкаНовогоЭлементаНастройкиСчетовУчета();
ДанныеНастройкиСчетовУчета.НастройкиСчетовУчета.Вставить(НастройкаСчетовУчета, ПараметрыНастройки);
НоваяСтрока = ОбъектДокумента.ПрочиеРасходы.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
НоваяСтрока.Сумма = Выборка.СуммаБУ;
НоваяСтрока.СуммаБезНДС = Выборка.СуммаБУ;
НоваяСтрока.СуммаУпр = Выборка.СуммаБУ;
НоваяСтрока.СуммаРегл = Выборка.СуммаБУ;
НоваяСтрока.ВременнаяРазница = Выборка.СуммаБУ;
НоваяСтрока.АналитикаРасходов = Выборка.Подразделение;
НоваяСтрока.СтатьяАктивовПассивов = СтатьяАктивовПассивов;
НоваяСтрока.КорПодразделение = Выборка.Подразделение;
НоваяСтрока.ДатаОтражения = ОбъектДокумента.Дата;
НоваяСтрока.НастройкаСчетовУчета = НастройкаСчетовУчета;
НоваяСтрока[ПараметрыНастройки.НастройкаСчетовУчета] = НастройкаСчетовУчета;
НоваяСтрока.ПредставлениеОтраженияВРеглУчете = НастройкаСчетовУчетаКлиентСервер.ПредставлениеНастройкиОтражения(НоваяСтрока, ПараметрыНастройки, ДанныеНастройкиСчетовУчета);
КонецЦикла;
КонецПроцедуры
Для целей отладки создадим команду, которая будет открывать форму и вызывать диалог загрузки файла:
&НаКлиенте
Процедура ЗаполнитьДанные(Команда)
Обработчик = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);
ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл для загрузки данных резерва ОС'");
ПараметрыЗагрузки.Диалог.Фильтр = НСтр(
"ru='Файл Excek (*.xls;*.xlsx)|*.xls;*.xlsx'");
ПараметрыЗагрузки.Диалог.ПредварительныйПросмотр = Ложь;
ПараметрыЗагрузки.Диалог.ИндексФильтра = 0;
ПараметрыЗагрузки.Диалог.ПроверятьСуществованиеФайла = Истина;
ФайловаяСистемаКлиент.ЗагрузитьФайл(Обработчик, ПараметрыЗагрузки);
КонецПроцедуры
В итоге, после загрузки файла на форме будет заполнена табличная часть, сформированы гиперссылки с настройками счетов учета.

Проверено на следующих конфигурациях и релизах:
- 1С:Комплексная автоматизация 2, релизы 2.5.22.129
- 1С:ERP Управление предприятием 2, релизы 2.5.22.129
Вступайте в нашу телеграмм-группу Инфостарт