Как автоматически заполнить обработкой табличную часть документа "Ввод начальных остатков" (Тип операции = "Расчеты с партнерами"). 1С: ERP

Публикация № 1170920 20.12.19

Администрирование - Администрирование данных 1С - Обработка документов

ERP загрузка данных из табличного документа обработка

В 1С: ERP (релиз 2.4.8.82) есть документ "Ввод начальных остатков". Он предназначен для переноса остатков из старых учетных программ при переходе на работу в новой конфигурации. В инструкциях на официальном сайте 1С пользователям новой конфигурации 1С: ERP предлагается заполнить этот документ. Каким образом они будут заполнять, не уточняется. Можно предположить, что предлагается интерактивно, вручную, ввести эти документы. Это следует из картинок в инструкции 1С. В данной статье я предлагаю способ автоматического программного заполнения документа "Ввод начальных остатков" с помощью обработки "Загрузка данных из табличного документа". При этом способе заполнения, время на процесс переноса остатков сокращается в десятки или даже сотни раз.

При написании данной статьи алгоритмы тестировались на 1с ERP релиз 2.4.8.82 

В инструкциях указано, что в табличной части документа "Ввод начальных остатков", по каждой строке, создается документ "Первичный документ" с нужным типом (Реализация клиенту, оплата поставщику и т.п.) который отражает ссылку на документ из старой конфигурации.

 
 документ "Первичный документ"

В инструкции предлагается создавать данный документ по каждой строке табличной части. Это долгий, кропотливый и нудный процесс. При его выполнении пользователями, случается большое количество ошибок, которые затем необходимо выявлять и исправлять. На это уходит огромное количество времени. 


Сами остатки, в виде табличной части со ссылкой на первичный документ (указывающий на документ из старой программы), отражают остатки в разрезе документов. Такие остатки загружаются с целью привязки к документам.


В процессе внедрения конфигурации возникает необходимость переноса различного вида остатков. Такой процесс может затянуться на продолжительный срок. После переноса остатков в новую базу, Заказчик может в старой базе закрывать период, изменяя документы и, таким образом, изменяя остатки.
Поэтому процесс переноса остатков может повторится. Чтобы уменьшить количество переносимой заново информации, можно переносить остатки в разрезе документов. Именно поэтому, в 1с ERP необходимо создавать документы "Первичный документ", которые являются ссылкой на документ в старой базе (любого вида).

 

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


Итак, у нас стоит задача переноса остатков Долгов Клиентов в 1с ERP. Не важно из какой базы или учетной системы.


Важно! До переноса остатков, из старой учетной системы в новую учетную систему, 1с ERP, должны быть перенесены и настроены:

  1.  Организации, Клиенты (Партнеры), Контрагенты, Договора (необязательно для данной задачи), валюты. 
  2.  Должна быть настроена связь Контрагентов и Партнеров (В Контрагентах указаны Партнеры).
  3.  В Контрагентах должны быть заполнены необходимые реквизиты: Наименование, ИНН, КПП. 

 

Итак, начнем. 

Шаг 1. Из старой учетной системы мы выгрузили остатки в виде некой таблицы, например Excel. В этой таблице у нас присутствуют колонки:

  1. Организация
  2. Наименование Контрагента
  3. ИНН (Контрагента)
  4. КПП (Контрагента)
  5. валюта
  6. Сумма долга
  7. Дата платежа (долга).

Шаг 2. Создаем Вводы начальных остатков по каждой Организации.
По каждой организации ведется отдельный учет долгов. У одного Контрагента могут быть долги перед несколькими организациями!
Для создания Ввода начальных остатков вызываем меню "НСИ и администрирование - Начальное заполнение - начальное заполнение" в открывшемся окне "Начальное заполнение" открываем пункт "Документы ввода начальных остатков". В форме документов открываем в левой панели пункт "Расчеты с партнерами - задолженность клиентов". В правой части окна нажимаем кнопку "Создать".
В окне нового документа выбираем необходимую нам организацию. Сохраняем документ. табличную часть не заполняем.

 
 Создаем Вводы начальных остатков по каждой Организации.

Шаг 3. Открываем обработку "Загрузку данных из табличного документа".
У меня есть стандартная версия данной обработки с диска ИТС, которая предназначена для запуска в Обычном приложении. В Управляемом приложении эта обработка не запускается. Поэтому, для работы с ней, мне необходимо запустить 1с ERP в режиме обычного приложения.
Не буду рассказывать, как запустить 1с ERP в режиме обычного приложения. Для этого есть инструкции в интернет. Если потребуется, могу привести ссылки.

 
 Открываем обработку "Загрузка данных из табличного документа".

Шаг 4. Заполняем шапку обработки
В шапке обработки выбираем в поле "Режим загрузки" = "Загрузка в табличную часть".
В поле Ссылка указываем созданный на шаге 2 документ, табличную часть которого мы будем заполнять.
В поле "табличная часть" указываем "Расчеты с партнерами".
В документе "Ввод начальных остатков" множество табличных частей. В данной задаче нам нужна именно указанная табличная часть.

Шаг 5. Заходим на вкладку "Настройка"
При выборе табличной части документа, в Настройках выбрались все реквизиты данной табличной части. 
Выключаем не нужные нам колонки "Номер", "Дата". В конфигураторе эти реквизиты называются "НомерРасчетногоДокумента", "ДатаРасчетногоДокумента". Эти колонки заполняются в других типах документа "Ввод начальных остатков" (реквизит документа "Тип операции")
Колонку "Контрагент" перемещаем в самый верх.
Колонка "Тип объекта расчетов" видна только в форме документа. В табличной части ее нет. Она формируется динамически, исходя из заполненных данных в колонках "Объект расчетов", "Расчетный документ". Дело в том, что в нашем Вводе начальных остатков мы будем загружать остатки долгов Клиентов в разрезе Реализаций (в колонке "Тип объекта расчетов" будет "Реализация клиенту"). 

 
 Заполняем вкладку "Настройка"

Шаг 6. На закладке "Табличный документ" добавляем колонки:
ИНН, КПП, Организация, Номер первичного документа, Код партнера, Наименование Контрагента, Дата платежа.
Наименования этих колонок мы записываем в 1 строке в колонки с номерами с 11 по 17.
Колонки ИНН, КПП, Организация служат для поиска данных в базе данных в алгоритме загрузки, который отрабатывает по каждой строке табличной части.
Колонки Номер первичного документа, Код партнера и т.п. - это колонки, в которые динамически подставляются данные алгоритмом. Эти данные необходимы для функционирования алгоритма. По сути это некий буфер обмена данными. 
Алгоритм заполняет каждую строку по ячейкам. Заполнение идет слева направо по порядку. колонки буфера обмена заполняются динамически и используются алгоритмом для заполнения остальных колонок.

Шаг 7. Открываем вкладку "Настройка", будем писать код алгоритма!
В строке с колонкой "Контрагент", в колонке "Режим загрузки" указываем "Вычислять".
В колонке "Выражение" вставляем код:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Контрагенты.Ссылка КАК Контрагент,
|    Контрагенты.Наименование КАК НаименованиеКонтрагента,
|    Контрагенты.Партнер.Код КАК КодПартнера
|ИЗ
|    Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|    Контрагенты.ИНН = &ИНН
|    И Контрагенты.КПП = &КПП
|    И Контрагенты.ПометкаУдаления = ЛОЖЬ";
Запрос.установитьПараметр("ИНН",    ТекстыЯчеек[11]);
Запрос.установитьПараметр("КПП",    ТекстыЯчеек[12]);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Количество()=1 Тогда
    Выборка.Следующий();
    Результат         = Выборка.Контрагент;
    //Сообщить("Контрагент = "+Результат);
    ТекстыЯчеек[15] = Выборка.КодПартнера;
    ТекстыЯчеек[16] = Выборка.НаименованиеКонтрагента;
ИначеЕсли Выборка.Количество()>1 Тогда
    Сообщить("По (ИНН,КПП) = ("""+ТекстыЯчеек[11]+","+ТекстыЯчеек[12]+""") найдено более 1 Контрагента!");
    Выборка.Следующий();
    Результат         = Выборка.Контрагент;
    //Сообщить("Контрагент = "+Результат);
    ТекстыЯчеек[15] = Выборка.КодПартнера;
    ТекстыЯчеек[16] = Выборка.НаименованиеКонтрагента;
ИначеЕсли Выборка.Количество()=0 Тогда
    Сообщить("Выборка Контрагентов пустая");
КонецЕсли; 

Объясняю действие кода:

Алгоритм обработки строки отрабатывает последовательно выражения всех строк сверху вниз по порядку.
Так как строка с колонкой "Контрагент" у нас указана первой сверху в табличной части обработки "загрузка данных из табличного документа", то она будет выполнена первой при начале обработки каждой строки.
В момент начала выполнения Выполняется запрос к базе данных. 
В запрос устанавливаются значения, которые берутся как члены массива "ТекстыЯчеек". Из скриншота, в верхней части окна мы видим расшифровку назначения данного массива, в программном контексте выполнения алгоритма заполнения ячейки. В массиве "ТекстыЯчеек" лежат тексты ячеек данной строки. Таким образом, обратившись к члену массива с соответствующим номером, мы получим текст соседней ячейки. Таким образом, мы получаем Тексты колонок "ИНН" и "КПП", а точнее ячеек строки в текущей строке, которая сейчас обрабатывается алгоритмом.

Поясню. Алгоритм обработки выполняется в каждой строке табличной части последовательно. Закладка "Табличный документ". Например, алгоритм начал выполняться в строке 2. Далее, в каждой строке начинается последовательно запускаться алгоритмы по каждой колонке. Берутся колонки, которые указаны в Настройках. Выполняются алгоритмы по их заполнению последовательно, сверху вниз. Например, сначала выполняется алгоритм колонки Контрагент, затем Партнер, затем Договор и т.д.

Далее заполняется переменная Выборка результатом запроса.
Далее Выборка последовательно проходится в цикле. 
В отдельных случаях выволятся сообщения об ошибках (когда в запросе по ИНН и КПП найдено несколько Контрагентов или ни одного).
Если все ок и Контрагент найден (по ИНН и КПП) тогда выполняется основной алгоритм обработки Выборки.
Если найдено несколько Контрагентов (по ИНН и КПП), берется первый. В сообщения выводится предупреждение об этом. Пользователь сам должен подумать что в данной ситуации делать (возможно потребуется заменить Контрагента в сформированном документе).

ВАЖНО! В тексты ячеек 15 и 16 записываются КодПартнера и НаименованиеКонтрагента. Текст этих ячеек будут использоваться в алгоритмах заполнения в последующих колонках.
Почему код партнера - это понятно. Чтобы найти ссылки по коду. Почему именно наименование а не код Контрагента? Такой вопрос задаст программист или пользователь, который незнаком с ERP. 
Отвечаю - потому что в 1с ERP, в справочнике Контрагенты, нет стандартного реквизита "код". У справочника, на закладке Данные, тип кода = Строка, длина кода = 0. Основное представление = наименование. Такая же ситуация у половины справочников в 1с ERP.

В строке с колонкой "Партнер", в колонке "Режим загрузки" указываем "Вычислять".
В колонке "Выражение" вставляем код:

Результат = Справочники.Партнеры.НайтиПоКоду(ТекстыЯчеек[15]);

Объясняю действие кода:
Используется текст ячейки, который был заполнен на предыдущем шаге (при выполнении запроса к БД).
Ищется ссылка по коду и подставляется в значение ячейки.

В строках с колонками "Договор" и "Валюта", "Сумма", в колонке "Режим загрузки" указываем "Искать".
В колонке "Выражение" вставляем "Наименование", "Код", "" соответственно.

В строке с колонкой "Дата платежа", в колонке "Режим загрузки" указываем "Вычислять".
В колонке "Выражение" вставляем код:

Результат                = Дата(ТекстыЯчеек[17]);

Объясняю действие кода:
Берется текст ячейки 17. В нее будет заносится текстовые данные, отражающие "Дату платежа".
Формат данных "ГГГММДД" например "20190101". ГГГГ = 2019 (год). ММ = число месяца, ДД - число дня

В строках с колонками "Сумма (регл.)", "Сумма (упр.)", в колонке "Режим загрузки" указываем "Вычислять".
В колонке "Выражение" вставляем код:

Результат =  ТекстыЯчеек[5];

Объясняю действие кода:
Берется текст ячейки 5. В ней указывается сумма долга.

В строке с колонкой "Объект расчетов", в колонке "Режим загрузки" указываем "Вычислять".
В колонке "Выражение" вставляем код:

ПервичныйДокумент = Документы.ПервичныйДокумент.СоздатьДокумент();
ПервичныйДокумент.Дата                         = ТекущаяДата();
ПервичныйДокумент.ТипПервичногоДокумента     = Перечисления.ТипыПервичныхДокументов.РеализацияКлиенту;
ПервичныйДокумент.Организация                 = Справочники.Организации.НайтиПоНаименованию(ТекстыЯчеек[13]);
ПервичныйДокумент.Контрагент                 = Справочники.Контрагенты.НайтиПоНаименованию(ТекстыЯчеек[16]);
ПервичныйДокумент.Партнер                     = Справочники.Партнеры.НайтиПоКоду(ТекстыЯчеек[15]);
ПервичныйДокумент.Валюта                     = Справочники.Валюты.НайтипоКоду("643");
ПервичныйДокумент.ПорядокРасчетов             = Перечисления.ПорядокРасчетов.ПоНакладным;
ПервичныйДокумент.СуммаДокумента             = ТекстыЯчеек[5];
ПервичныйДокумент.СуммаРегл                 = ТекстыЯчеек[5];
ПервичныйДокумент.Договор                     = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();

Попытка
    ПервичныйДокумент.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("документ создался");
    
    Результат = ПервичныйДОкумент.Ссылка;

    ТекстыЯчеек[14] = ПервичныйДОкумент.Номер;
ИСключение
    ПервичныйДокумент = Документы.ПервичныйДокумент.СоздатьДокумент();
    Сообщить("документ НЕ создался по причине: "+ОписаниеОшибки());
КонецПопытки;

Объясняю действие кода:
Создается новый экземпляр документа ПервичныйДокумент с заполнением реквизитов.
При заполнении реквизитов используются ранее заполненные вручную или динамически колонки (массив ТекстыЯчеек).
После заполнения, документ записывается в базу данных, с проведением.
Если попытка записи удалась, то в значение текущей ячейки записывается ссылка на созданный документ.
В текст ячейки 14 записывается номер созданного документа (для доступа в алгоритме заполнения следующей ячейки).

В строке с колонкой "Расчетный документ", в колонке "Режим загрузки" указываем "Вычислять".
В колонке "Выражение" вставляем код:

ПервичныйДокумент_Номер = ТекстыЯчеек[14];

Если ПервичныйДокумент_Номер<>"" Тогда
    Результат = Документы.ПервичныйДокумент.НайтиПоНомеру(ПервичныйДОкумент_Номер , ТекущаяДата());
КонецЕсли;

Объясняю действие кода:

Используется текст ячейки 14. Если на предыдущем шаге успешно создан документ в БД, то в ячейку 14 записан его номер. Этот номер используется для нахождения ссылки на данный документ. Эта ссылка записывается в значение ячейки.


Шаг 8. Заполняем табличную часть на закладке "Табличный документ".
Данные заполняются, как указано на скриншоте.
Важно заполнить ИНН, КПП Контрагента, Наименование Организации, Дату платежа, Валюту, Сумму.

Шаг 9. Нажимаем кнопку "Загрузить".
Обработка отработает алгоритмы и перенесет данные в табличную часть документа.
По каждой строке создастся документ "Первичный документ", его ссылка будет прописана в строке табличной части документа "Ввод начальных остатков".
Если будут ошибки, то их необходимо обработать вручную, с применением мозга. Это отдельная задача, не рассматриваемая в данной статье.

Шаг 10. Проверяем заполнение табличной части документа "Ввод начальных остатков".
Если что-то не сработало несколько раз, можно дополнить или изменить код алгоритмов.

 

Дополнительно я выложил настройки стандартной обработки "загрузка данных из табличного документа". Настройки включают в себя программный код, который приведен в статье.

Кроме того, выложил mxl файл табличного документа. В нем приведен пример заполнения табличной части обработки данными.


Я использовал описанный в статье алгоритм для заполнения большого количества документов Ввод начальных остатков при внедрении 1с ERP на предприятии.
Удачи вам в делах!

Скачать файлы

Наименование Файл Версия Размер
Настройки загрузки в табличный документ - Долги Клиентов из Эксель

.mxlz 15,96Kb
4
.mxlz 1 15,96Kb 4 Скачать
Пример заполнения таблицы в обработке Загрузка данных из табличного документа

.mxl 3,17Kb
3
.mxl 3,17Kb 3 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. _Dmitry_ 13.01.20 07:57 Сейчас в теме
Все получилось в лучшем виде, делал 1 в 1 как написано, единственное отмечу что обработка существует для УФ, яндексом находится быстро.
2. user1375596 28.04.20 12:31 Сейчас в теме
Спасибо за данное решение. Тоже возникла необходимость внести начальные остатки по контрагентам.
Подскажите, пожалуйста, еще по одному моменту, почему у меня на одну строку табличной части (можно сказать, что на одного Контрагента) создается два первичных документа?

Пробую ваше решение на УТ 11.4
5. pvlunegov 170 29.04.20 06:17 Сейчас в теме
(2) Сложно сказать. Чтобы полноценно ответить на ваш вопрос, мне необходимы детальные сведения о ваших действиях.
Из кода, указанного в публикации, следует что на 1 строку обработки будет создан 1 первичный документ.
Почему у вас возникло 2 табличных документа...
ВОЗМОЖНО потому что вы в табличный документ вставили 2 одинаковых строки.
Отсортируйте их по колонкам "Объект расчетов, контрагент" возможно вы найдете двойки. Это и есть ответ на ваш вопрос.
3. user1375596 28.04.20 13:14 Сейчас в теме
Забыл уточнить, что веду только Контрагентов .. без Партнеров (заранее прошу прощения - новичок, если что-то не то сказал про Контрагентов и Партнеров)
4. pvlunegov 170 29.04.20 06:11 Сейчас в теме
(3) Добрый день! Дело в том, что в ERP есть святая двоица справочников (Контрагент, Партнер). Каждый из них отвечает за свой план учета. Контрагенты отвечают за официальную часть публикации сведений о предприятии (внешнем), а Партнеры отвечают за управленческую часть публикации сведений о предприятии (внешнем). В других конфигурациях эти планы учета не разделялись, они велись одним справочником - Контрагенты.
Отсюда вывод - как бы не вели свой учет, вам не обойтись без ведения обоих справочников - и Контрагенты и Партнеры. Невозможно отказаться хотя бы потому, что оба справочника используются в различных документах. Если вести документооборот, то очевидно, что ПРИДЕТСЯ заводить и Партнеров и Контрагентов.
В ПРОСТОМ случае, вы можете для 1 Партнера иметь 1 Контрагента (взаимно-однозначное соответствие).
В СЛОЖНЫХ случаях (холдинги, сети, распределенные сети и др.) будет множественная связь (несколько Парнтеров к 1 Контрагенту, нескоколько Контрагентов к 1 Партнеру).
6. user1375596 29.04.20 12:51 Сейчас в теме
Спасибо, что ответили!

Я могу с уверенностью сказать, что в табличной части у меня одна строка на одного Контрагента.

Кстати, с двойными первичными документами разобрался. Не могу точно сказать, это ли повлияло на задвоение, но я поправил в Вашем коде пару "ДОкумент" на "Документ" и теперь все нормально.

Ну и на базе Вашего решения создал начальные остатки по Авансам Контрагентов.

Еще раз Спасибо!
Оставьте свое сообщение

См. также

Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали Промо

Практика программирования Дебиторская и кредиторская задолженность Дебиторская и кредиторская задолженность v8 v8::СКД КА1 УТ10 УПП1 УУ Абонемент ($m)

Предлагается метод для быстрого нахождения неоплаченных долгов при распределении оплаты по правилу ФИФО, основанный на дихотомии. Описывается реализация метода в виде достаточно простого запроса, решающего за линейное время указанную задачу, считавшуюся ранее существенно более трудоемкой. Приводятся примеры использования запроса в отчетах на СКД для конфигураций УТ, КА, УПП.

1 стартмани

28.02.2014    70288    ildarovich    131    

Дополнительные расходы на основе перемещения запасов в УНФ (пошаговая разработка расширения конфигурации)

Обработка документов Учет ТМЦ Расширения v8 УНФ Россия УУ Абонемент ($m)

Доброго времени! Предлагаю небольшое расширение для конфигурации "Управление нашей фирмой", позволяющее включать документ "Перемещение запасов" в таблицу оснований документа "Дополнительные расходы".

1 стартмани

17.10.2019    7116    aximo    5    

Многопоточная обработка данных на примере перепроведения документов

Обработка документов Практика программирования v8 ERP2 УТ11 КА2 Абонемент ($m)

Дальнейшее развитие темы фоновой обработки данных - проведение документов в потоках. Настройка параметров и запуск основного процесса (менеджера потоков). Разбивка документов для проведения на не связанные друг с другом наборы и запуск дополнительных фоновых заданий для отдельных потоков. Отслеживание выполнения каждого потока в родительском сеансе.

1 стартмани

17.09.2019    11779    ids79    46    

Собственный алгоритм нумерации документов определенного вида

Практика программирования Обработка документов Разработка v8 БП3.0 Россия Абонемент ($m)

Создание собственного, отличного от платформенного алгоритма нумерации документов определенного вида.

1 стартмани

11.04.2019    4267    xan333    12    

Сторнирование документов отсутствия по невыясненной причине после переноса данных. Замена на больничный лист. ЗУП 3.1.8

Обработка документов Бухгалтерский учет Зарплата Учет рабочего времени Зарплата Учет рабочего времени v8 v8::СПР ЗУП3.x Россия БУ Абонемент ($m)

Наши кадры в ЗУП 2.5 на время отсутствия документов о больничном вводят документ "Невыходы в организациях". Спокойно рассчитывают, а когда документы о больничном листе приносят - сторнируют невыход. В целом ничего криминального, и практика частая в различных организациях, но есть нюансы, при переходе на ЗУП 3.1.

1 стартмани

22.03.2019    6273    Mogilnikova    0    

Создание подключаемой обработки табличной части с диалогом запроса параметров заполнения (управляемые формы)

Обработка документов Обработка справочников Практика программирования v8::УФ 1cv8.cf Абонемент ($m)

Пошаговый пример покажет, как сделать обработку табличной части для документа, предварительно открывающую диалоговое окно, где пользователь может указать требуемые характеристики (параметры), по которым произойдет обработка.

1 стартмани

03.05.2018    65115    Mirage78    26    

Автоматическое оповещение пользователей при проведении документа Поступление товаров, с возможностью дублировать сообщения другому сотруднику

Практика программирования Обработка документов Документооборот и делопроизводство Документооборот и делопроизводство v8 v8::ОУ УТ11 Россия Абонемент ($m)

Данная разработка автоматически оповещает пользователя о поступлении товара по заказу клиента. Схема работы : Заказ клиента > Заказ поставщику > Поступление товаров. Оповещается пользователь, который создавал заказ клиента (менеджер). Оповещение выводится на экран и ждет подтверждения о прочтении. После подтверждения - фиксируется время прочтения оповещения. Есть возможность просматривать все сообщения по пользователю за любой период. Есть возможность дублировать сообщение другим пользователям. Например, если менеджер в отпуске, и его заменяет другой менеджер, и оповещения будут отправляться второму (третьему и т.д.).

1 стартмани

26.02.2018    13836    Natali307192013    8