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

Как установить дату документа?

Автор Ciz, 29 янв 2021, 15:09

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

Ciz

Есть код который берет значения из таблицы Excel и преобразовывает их в документ ПКО:

...
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл         

Для каждого СтрокаМассив из МассивКолонок Цикл

ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
// Получение имени колонки
ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;

НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

Если ИмяКолонки = "Дата" Тогда
//убираем лишние проблемы (работает)
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,Символы.НПП," ");
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,"  "," ");
//добавляем секунды
ТекущееЗначение = ТекущееЗначение + ":00";
//форматируем строку как дату (работает)
ТекущееЗначение = Дата(ТекущееЗначение);
//переводим дату в формат ГГГГММДДччммсс (работает)
ТекущееЗначение = Формат(ТекущееЗначение, "ДФ='yyyyMMddHHmmss'");
// ставим дату документа как текущее значение (не работает)
// игнорирует все изменения, пытается использовать ТекущееЗначение как оно было изначально
НовыйДокумент.Дата = ТекущееЗначение;
Сообщить("Ставим дату: " + ТекущееЗначение + " НовыйДокумент.Дата: " + НовыйДокумент.Дата);
КонецЕсли;
...
Если ИмяКолонки = "Приход наличными" Тогда
НовыйДокумент.СуммаДокумента = ТекущееЗначение;
КонецЕсли;

Если НовыйДокумент.СуммаДокумента > 0 Тогда
// Запись и проведение документа
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
КонецЕсли;
КонецЦикла;



Вместо того, чтобы установить дату как положено выдает следующее:
ЦитироватьСтавим дату: 20210128173000 НовыйДокумент.Дата: 28.01.2021 17:30:00
Поступление наличных  от 01.01.0001 0:00:00 невозможно поместить в запрещенный период.

Дате  соответствует запрет изменения данных для пользователя "Администратор" по 31.12.2017 (установлена общая дата запрета)
Установка остальных параметров (сумма, счет учета, организация) работает как положено.

LexaK

аааа, у вас запись внутри цикла стоит, ее надо из цикла вынести

        Если НовыйДокумент.СуммаДокумента > 0 Тогда
                    // Запись и проведение документа       
                    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
                    Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
                КонецЕсли;
примерно так (код конечно отпадный)


Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл         
           
            НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

            Для каждого СтрокаМассив из МассивКолонок Цикл
               
                ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
                // Получение имени колонки
                ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;
           
                Если ИмяКолонки = "Дата" Тогда
                    //убираем лишние проблемы (работает)
                    ТекущееЗначение = СтрЗаменить(ТекущееЗначение,Символы.НПП," ");
                    ТекущееЗначение = СтрЗаменить(ТекущееЗначение,"  "," ");
                    //добавляем секунды
                    ТекущееЗначение = ТекущееЗначение + ":00";
                    //форматируем строку как дату (работает)
                    ТекущееЗначение = Дата(ТекущееЗначение);
                    //переводим дату в формат ГГГГММДДччммсс (работает)
                    ТекущееЗначение = Формат(ТекущееЗначение, "ДФ='yyyyMMddHHmmss'");
                    // ставим дату документа как текущее значение (не работает)
                    // игнорирует все изменения, пытается использовать ТекущееЗначение как оно было изначально
                    НовыйДокумент.Дата = ТекущееЗначение;
                    Сообщить("Ставим дату: " + ТекущееЗначение + " НовыйДокумент.Дата: " + НовыйДокумент.Дата);
                КонецЕсли;
...
                Если ИмяКолонки = "Приход наличными" Тогда
                    НовыйДокумент.СуммаДокумента = ТекущееЗначение;
                КонецЕсли;
   
КонецЦикла;

Если НовыйДокумент.СуммаДокумента > 0
и ЗначениеЗаполнено(НовыйДокумент.Дата) Тогда
                // Запись и проведение документа       
                НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
                Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
            КонецЕсли;

      КонецЦикла;
 

ответ Понравился? (в смысле пригодился?)

Ciz

Цитата: LexaK от 29 янв 2021, 15:25
аааа, у вас запись внутри цикла стоит, ее надо из цикла вынести

        Если НовыйДокумент.СуммаДокумента > 0 Тогда
                    // Запись и проведение документа       
                    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
                    Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
                КонецЕсли;
примерно так (код конечно отпадный)
Спасибо, так работает, но обрабатывает только последнюю строку в таблице. Видимо опять что-то не то.

Вот полный цикл:
Если МассивКолонок.Количество() <> 0 Тогда
// Переменная СтрокаОтсчета - номер строки в Excel, с которой начинается заполнение
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл         

НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();

Для каждого СтрокаМассив из МассивКолонок Цикл

ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
// Получение имени колонки
ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;

Если ИмяКолонки = "Дата" Тогда
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,Символы.НПП," ");
ТекущееЗначение = СтрЗаменить(ТекущееЗначение,"  "," ");
ТекущееЗначение = ТекущееЗначение + ":00";
ТекущееЗначение = Дата(ТекущееЗначение);
ТекущееЗначение = Формат(ТекущееЗначение, "ДФ='yyyyMMddHHmmss'");
НовыйДокумент.Дата = ТекущееЗначение;
Сообщить("Ставим дату: " + ТекущееЗначение + " НовыйДокумент.Дата: " + НовыйДокумент.Дата);
КонецЕсли;

НовыйДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь;
НовыйДокумент.Комментарий = "Загружено из файла " + Объект.ФайлExcel;
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
НовыйДокумент.Организация = Справочники.Организации.ОрганизацияПоУмолчанию();
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийПКО.РозничнаяВыручка;
НовыйДокумент.СчетКасса = ПланыСчетов.Хозрасчетный.КассаОрганизации;

Если ИмяКолонки = "Приход наличными" Тогда
НовыйДокумент.СуммаДокумента = ТекущееЗначение;
КонецЕсли;

КонецЦикла;

Если НовыйДокумент.СуммаДокумента > 0
и ЗначениеЗаполнено(НовыйДокумент.Дата) Тогда
// Запись и проведение документа       
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
КонецЕсли;

КонецЦикла;
Иначе
Сообщить("Ошибка в файле Excel, обработка невозможна!");
КонецЕсли;


LexaK

так у вас
  ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
текст, строка
и вы его сразу присваиваете Сумме. здесь
   Если ИмяКолонки = "Приход наличными" Тогда
               НовыйДокумент.СуммаДокумента = ТекущееЗначение;
    КонецЕсли;

не всегда ТЕКСТ правильно предобразовывается в число, проверьте что у вас с Суммой, примерно так

Если НовыйДокумент.СуммаДокумента > 0
            и ЗначениеЗаполнено(НовыйДокумент.Дата) Тогда
            // Запись и проведение документа       
            НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
            Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
Иначе
Сообщить("Сумма документа: " + НовыйДокумент.СуммаДокумента + ", Дата: " + НовыйДокумент.Дата);
  КонецЕсли;


ответ Понравился? (в смысле пригодился?)

Ciz

Цитата: LexaK от 29 янв 2021, 16:10
так у вас
  ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text;
текст, строка
и вы его сразу присваиваете Сумме. здесь
   Если ИмяКолонки = "Приход наличными" Тогда
               НовыйДокумент.СуммаДокумента = ТекущееЗначение;
    КонецЕсли;
Действительно. Сделал так
Если ИмяКолонки = "Приход наличными" Тогда
ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;
                    НовыйДокумент.СуммаДокумента = ТекущееЗначение;
                КонецЕсли;

Если я правильно понимаю, то в Value хранится просто цифровое значение без пробелов и лишних символов.

LexaK

ЦитироватьЕсли я правильно понимаю, то в Value хранится просто цифровое значение без пробелов и лишних символов.
да ХЗ, всегда Текст брали,
если получается используйте Value
самое главное, что с результатом, документы создаются?
ответ Понравился? (в смысле пригодился?)

Ciz

Цитата: LexaK от 29 янв 2021, 17:23самое главное, что с результатом, документы создаются?
Да, создаются. Сейчас пытаюсь избавиться от лишнего цикла, с ним слишком медленно работает.

// Проверка корректности заполнения колонок
// Переменная МассивКолонок содержит список номеров колонок, которые будут перегружаться
МассивКолонок = Новый ТаблицаЗначений;
МассивКолонок.Колонки.Добавить("НомерКолонки");
МассивКолонок.Колонки.Добавить("НазваниеКолонки");

Если ОткудаВыгружаем = 0 Тогда
ОткудаВыгружаем = 1;
ИначеЕсли ОткудаВыгружаем = 1 Тогда
ОткудаВыгружаем = 3;
Иначе
Сообщить("Необходимо указать с какого сайта была выгружена таблица Excel");
Возврат;
КонецЕсли;

ДатаДокументаНомерКолонки = -1;
Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл
ИмяКолонки = Excel.Cells(ОткудаВыгружаем, КолонкаОтсчета).Text;
// Удаление лишних пробелов из имен колонок
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ","");
НовСтрока = МассивКолонок.Добавить();
НовСтрока.НомерКолонки = КолонкаОтсчета;
НовСтрока.НазваниеКолонки = ИмяБезПробелов;
Если ИмяБезПробелов = "Датаивремясозданиядокумента" или ИмяБезПробелов = "Дата" Тогда
ДатаДокументаНомерКолонки = НовСтрока.НомерКолонки; // определяем номер колонки с датой
КонецЕсли;
//Сообщить(ИмяБезПробелов);
КонецЦикла;

Сообщить(ДатаДокументаНомерКолонки);

Если ДатаДокументаНомерКолонки = -1 Тогда
Сообщить("Отсутствует колонка 'Дата', обработка невозможна.");
Возврат;
КонецЕсли;

LexaK

ЦитироватьДа, работает. Сейчас пытаюсь упросить цикл, слишком уж медленно выполняется.
есссстествено, нормальные прогеры так данные из Екселя не грузят.

одной командой читаете Ексель в ТабличныйДокумент
ДанныеФайла.Прочитать(ПолныйПутьФайлаЕксель);

затем ТабДок можно перегнать/преобразовать в ТаблицуЗначений
по этой ТЗ ОДНИМ запросом, по колонкам с Кодами/Артикулами/Наименованиями  найти все ссылочные элементы

и уже по подготовленным данным быстренько создать документы!


ответ Понравился? (в смысле пригодился?)

Ciz

LexaK,
Цитата: LexaK от 29 янв 2021, 18:00есссстествено, нормальные прогеры так данные из Екселя не грузят.
Ну я начинающий, всего неделю обработки пишу. Пробовал через Табличный Документ, но не вышло, поэтому делаю таким вот образом.
Добавлено: 29 янв 2021, 19:08


Еще вопрос. Как установить значение в строку "Склад"? Не могу найти функцию.

LexaK

ЦитироватьКак установить значение в строку "Склад"? Не могу найти функцию.
в вашем случае, примерно так

Если ИмяКолонки = "Склад" Тогда
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию(ТекущееЗначение);
или
НовыйДокумент.Склад = Справочники.Склады.НайтиПоКоду(ТекущееЗначение);

в зависимости что у вас в колонке Склад, код или название склада!
ответ Понравился? (в смысле пригодился?)

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск