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

Таблица цен

Автор Дмитрий Корнилов, Вчера в 12:12

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

Дмитрий Корнилов

&НаКлиенте
Процедура ЗагрузитьДанныеИзТаблицы(Команда)
   
    // Проверка условия ТЗ: Если таблица пустая, то ничего не делаем
    Если ТаблицаЦен.Количество() = 0 Тогда
        ПоказатьПредупреждение(, "Таблица значений пуста! Операция отменена.");
        Возврат;
    КонецЕсли;
   
    // Передаем таблицу на сервер для выполнения транзакции записи
    РезультатЗагрузки = ЗагрузитьДанныеНаСервере();
   
    // Анализируем результаты и информируем пользователя через клиентский метод
    Если РезультатЗагрузки.Ошибок = 0 Тогда
        ТекстСообщения = СтрШаблон("Загрузка успешно завершена! Добавлено записей в регистр: %1", РезультатЗагрузки.Успешно);
        ПоказатьПредупреждение(, ТекстСообщения);
    Иначе
        ТекстСообщения = СтрШаблон("Загрузка завершена с замечаниями.%1Добавлено корректных записей: %2.%1Пропущено строк (дубли или пустые): %3.",
            Символы.ПС, РезультатЗагрузки.Успешно, РезультатЗагрузки.Ошибок);
        ПоказатьПредупреждение(, ТекстСообщения);
    КонецЕсли;
   
КонецПроцедуры

&НаСервере
Функция ЗагрузитьДанныеНаСервере()
   
    // Структура для возврата статистики на клиентский контекст
    Результат = Новый Структура;
    Результат.Вставить("Успешно", 0);
    Результат.Вставить("Ошибок", 0);
   
    // Обходим строки таблицы формы в цикле
    Для Каждого СтрокаТаблицы Из ТаблицаЦен Цикл
       
        // Блокируем ошибку "Период не может быть пустым":
        // Принудительно читаем дату из колонки. На форме она отображается как "Дата",
        // но в конфигураторе реквизит может называться "Дата" или "Период".
        // Данная конструкция корректно определит значение в обоих случаях.
        ТекущаяДатаСтроки = '00010101';
        Попытка
            ТекущаяДатаСтроки = СтрокаТаблицы.Дата;
        Исключение
            ТекущаяДатаСтроки = СтрокаТаблицы.Период;
        КонецПопытки;
       
        // Проверяем заполненность ключевых полей в текущей строке, чтобы избежать записи пустых значений
        Если Не ЗначениеЗаполнено(СтрокаТаблицы.Контрагент)
            Или Не ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура)
            Или Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЦены)
            Или Не ЗначениеЗаполнено(ТекущаяДатаСтроки)
            Или ТекущаяДатаСтроки = '00010101' Тогда
           
            Результат.Ошибок = Результат.Ошибок + 1;
            Сообщить(СтрШаблон("Строка №%1 пропущена: обнаружены незаполненные ключевые поля или дата!", ТаблицаЦен.Индекс(СтрокаТаблицы) + 1));
            Продолжить; // Переходим к следующей строке таблицы
        КонецЕсли;
       
        // Инициализируем менеджер записи для проверки уникальности в базе данных
        МенеджерЗаписи = РегистрыСведений.ОсновнаяЦенаКонтрагента.СоздатьМенеджерЗаписи();
       
        // Заполняем уникальный ключ записи (Период + Все Измерения регистра)
        МенеджерЗаписи.Period       = ТекущаяДатаСтроки;
        МенеджерЗаписи.Контрагент   = СтрокаТаблицы.Контрагент;
        МенеджерЗаписи.Номенклатура = СтрокаТаблицы.Номенклатура;
        МенеджерЗаписи.ТипЦены      = СтрокаТаблицы.ТипЦены;
       
        // Выполняем чтение из базы данных по указанному ключу
        МенеджерЗаписи.Прочитать();
       
        // Проверяем результат чтения на уникальность
        Если МенеджерЗаписи.Выбран() Тогда
            // Запись найдена! Нарушение уникальности. Пропускаем строку, чтобы не перезаписать старую цену
            Результат.Ошибок = Результат.Ошибок + 1;
            Сообщить(СтрШаблон("Строка №%1: Цена для '%2' по товару '%3' на дату %4 уже существует. Пропущено.",
                ТаблицаЦен.Индекс(СтрокаТаблицы) + 1, СтрокаТаблицы.Контрагент, СтрокаТаблицы.Номенклатура, Формат(ТекущаяДатаСтроки, "ДФ=dd.MM.yyyy")));
        Иначе
            // Записи с таким набором измерений на эту дату нет — уникальность соблюдена!
            МенеджерЗаписи.Цена = СтрокаТаблицы.Цена; // Заполняем ресурс
           
            Попытка
                // Замещать = Ложь, так как мы гарантированно создаем новую уникальную запись
                МенеджерЗаписи.Записать(Ложь);
                Результат.Успешно = Результат.Успешно + 1;
            Исключение
                Результат.Ошибок = Результат.Ошибок + 1;
                Сообщить("Ошибка при физической записи строки: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
            КонецПопытки;
        КонецЕсли;
       
    КонецЦикла;
   
    // Возвращаем собранную статистику на клиент
    Возврат Результат;
   
КонецФункции

Теги:

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

Рейтинг@Mail.ru

Поиск