Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 ноя 2025, 13:19

Задача работа с регистром сведений

Автор avt530, 13 сен 2025, 14:21

0 Пользователей и 1 гость просматривают эту тему.

avt530

Задача - при нажатии на кнопку Загрузить в форме списка регистра сведений "Цены поставщиков"
 пользователь должен иметь возможность выбрать текстовый файл с ценами
поставщика после чего в регистре сведений должны появиться записи на основании данных
выбранного файла

Выдается ошибка: Запись с такими ключевыми полями существует! Цены поставщиков...(Регистр сведений Цены поставщиков Номер строки 2)
Не могу понять почему не записывается Набор записей. (С менеджером записи та же ошибка)
Простьба помочь в решении

Попытка решения:

&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
   //1.Получить путь к текстовому файлу
   Проводник = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   
   Если Проводник.Выбрать() = Ложь Тогда
      Возврат;
   КонецЕсли;
   ПутьКФайлу = Проводник.ПолноеИмяФайла;
   
   //2.Прочитать содержимое файла в строку
   Текст = Новый ТекстовыйДокумент;
   Текст.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
   СтрокаТекста = Текст.ПолучитьТекст();
   
   ЗагрузитьИзФайлаНаСервере(СтрокаТекста);
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьИзФайлаНаСервере(СтрокаТекста)
   
   //3.Создание таблицы значений
   ТаблицаДанных = Новый ТаблицаЗначений; 
   ТаблицаДанных.Колонки.Добавить("Контрагент");
   ТаблицаДанных.Колонки.Добавить("Договор");
   ТаблицаДанных.Колонки.Добавить("Номенклатура");
   ТаблицаДанных.Колонки.Добавить("Цена");
   
   //4.заполнение таблицы значений
   КоличествоСтрок = СтрЧислоСтрок(СтрокаТекста);
   Для НомерСтроки = 1 по КоличествоСтрок Цикл
      ТекСтрока = СтрПолучитьСтроку(СтрокаТекста, НомерСтроки);
      МассивСлов = СтрРазделить(ТекСтрока, ",");
      
      Если МассивСлов.Количество()= 0 Тогда
         Сообщить("Некорректное поведение");
      КонецЕсли;
      
      СтрокаТаблицы = ТаблицаДанных.Добавить();
      СтрокаТаблицы.Контрагент = МассивСлов[0];
      СтрокаТаблицы.Договор = МассивСлов[1];
      СтрокаТаблицы.Номенклатура = МассивСлов[2];
      СтрокаТаблицы.Цена = МассивСлов[3];
      
   КонецЦикла;   
   
   // 5.Создание набора записей
   НаборЗаписей = РегистрыСведений.ЦеныПоставщиков.СоздатьНаборЗаписей();
   
   Для каждого СтрокаТаблицы Из ТаблицаДанных Цикл
      НоваяЗапись = НаборЗаписей.Добавить();
      НоваяЗапись.Контрагент = СтрокаТаблицы.Контрагент;
      НоваяЗапись.Договор = СтрокаТаблицы.Договор;
      НоваяЗапись.Номенклатура = СтрокаТаблицы.Номенклатура;
      НоваяЗапись.Цена = СтрокаТаблицы.Цена;
   КонецЦикла;
   НаборЗаписей.Записать();
   
КонецПроцедуры



antoneus

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

antoneus

Следовательно, нужно превращать строки в ссылки.
Способ в лоб - на каждом проходе цикла искать ссылку по наименованию.

СтрокаТаблицы.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(МассивСтрок[0]);
Очень затратно по времени и ресурсам. Немного облегчит ситуацию кэш.

КэшКонтрагентов = Новый Соответствие;
....
Наименование = МассивСтрок[0];
Контрагент = КэшКонтрагентов.Получить(Наименование);
Если Контрагент = Неопределено Тогда
    Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Наименование);
    Если Контрагент.Пустая() Тогда
        //или создаем контрагента или вообще не заполняем строку таблицы и идем дальше по файлу
    КонецЕсли;
    КэшКонтрагентов.Вставить(Наименование, Контрагент)
КонецЕсли;
СтрокаТаблицы.Контрагент = Контрагент;

Еще лучше - собрать таблицу со ссылками в запросе, но об этом как-нибудь в другой раз.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск