• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Dao и Excel 2007

  • Автор темы DjAlex
  • Дата начала
D

DjAlex

Добрый день :welcome: ! Сталкнулся вот с такой проблемой, пытаюсь загрузить данные из Excel, в 1с с помощью DAO, в 97-2003 формате(xls) работает хорошо, примерно 8000 строчек обрабатывает и грузит в таблицу значений за секунду, но вот при попытке открытии базы в формате 2007(xlsx), выдает ошибку, даже и не знаю что с ней делать.
Ошибка:
Произошла исключительная ситуация (DAO.Workspace): Невозможно найти устанавливаемый ISAM.

Искал по ошибке :google: , как обойти ее, так ничего путного и не нашел :KillMe: ((((

Код:

Попытка
DAO= Новый COMОбъект("DAO.DBEngine.36");
Исключение
Попытка
DAO= Новый COMОбъект("DAO.DBEngine.35");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецПопытки;

Сообщить("Соединение с DAO, прошло успешно.",СтатусСообщения.Информация);


//Открыть базу данных
Попытка
Если ВРег(Прав(ЭлементыФормы.ИмяФайла.Значение,3)) = "XLS" Тогда
//Для Microsoft Office 2003 и более ранних версий таблиц
db = DAO.Workspaces(0).OpenDatabase(""+ЭлементыФормы.ИмяФайла.Значение+"", 0, 1, "Excel 8.0; HDR=NO;")
Иначе
//Для Microsoft Office 2007
db = DAO.Workspaces(0).OpenDatabase(""+ЭлементыФормы.ИмяФайла.Значение+"", 0, 1, "Excel 12.0; HDR=NO;")
КонецЕсли;
Сообщить("Открытие базы данных, прошло успешно.",СтатусСообщения.Информация);
Исключение
Сообщить("Не удалось открыть базу данных.", СтатусСообщения.Важное);
Возврат;
КонецПопытки;

//Получить записи
Recordset = Db.OpenRecordset("SELECT [f1],[f2],[f4],[f5],[f7] FROM [POTRN$A1:G50000] WHERE [f7]>0");
и так далее...
 
V

vitfil

Вы уверены, что у вас стоит DAO 3.6?
Если мне не изменяет склероз, MS рекомендует использовать DAO исключительно для обмена данными между приложениями MS. По крайней мере, источник должен быть MS. Во вторых, MS предписывает использовать DAO исключительно в основном потоке приложения ( - тут про 3.0, но что-то не появилось данных об отмене этого требования в более поздних версиях), коим транслятор 1С не является.
 
D

DjAlex

Вы уверены, что у вас стоит DAO 3.6?
Если мне не изменяет склероз, MS рекомендует использовать DAO исключительно для обмена данными между приложениями MS. По крайней мере, источник должен быть MS. Во вторых, MS предписывает использовать DAO исключительно в основном потоке приложения ( - тут про 3.0, но что-то не появилось данных об отмене этого требования в более поздних версиях), коим транслятор 1С не является.

Стоит 3.6, это точно))) Не работает, только с форматом Excel 2007, если файл в формате *.xls, то никакого сбоя при работе нет, данные успешно загружаюся в систему, если формат файла *.xlsx, то при открытии базы уже вылетает ошибка и ничего пока я с этим поделать не могу...((
 
V

vitfil

Что мешает отказаться от DAO в пользу ADO?
 
D

DjAlex

Что мешает отказаться от DAO в пользу ADO?
Мешает скорость, с DAO, производительность лучше, чем с ADO, это ощущается, в том случаии, если количество строк очень много, как к примеру у меня может и 50000 строк быть...
 
V

vitfil

Скорость DAO - это один из вариантов нестандартного непрогнозируемого поведения... "Журнал Здоровье прямо на это указывает..." (с) "Иван Васильевич меняет профессию".

Если смотреть на проблему шире... Меня все чаще в последнее время начинают напрягать отписки MS по тому или иному поводу вида "Работоспособность не гарантируется..." или "Устойчивая работоспособность не гарантируется..." или еще что-то в этом роде. Не так давно столкнулся с тем, что некоторые api-функции, которые раньше успешно применял как-то странно себя ведут. А именно, что-то было связано с ожиданием (требовалось, чтобы программа ждала несколько секунд, прежде чем выполнить следующую операцию). Так вот, скомпилированная на моем ноуте программа у меня же работала нормально, а на некоторых других "не ждала". Долгий поиск в MSDN привел меня к "Начиная с ХР корректная работа этой функции не гарантируется". Т.е. получается, она может то работать, то не работать... Собственно, так и получилось. На некоторых компах работала устойчиво. На других - НЕ работала устойчиво. Но были такие уникумы, на которых от перезагрузке к перезагрузке то работала, то не работала.
Вот такая песня о Данко...
 
A

AlexWent

Уважаемый DjAlex
Можно попросить прислать пример кода работы с XLS из DAO? Если можно, с функцией создания xls-файла с нуля. :sorry:
Хотел написать просьбу в личку, но почему-то мне это тут запрещено :fuckyou:
 
D

DjAlex

Мне не охото было вырезать, я думаю разберетесь...

Код:
Процедура СканироватьФайлНажатие(Элемент)

ВыбФайл = Новый Файл(ЭлементыФормы.ИмяФайла.Значение);
Если НЕ ВыбФайл.Существует() Тогда
ОбработатьОшибку("Файл "+ ЭлементыФормы.ИмяФайла.Значение +" не существует.",СтатусыСообщения.Важное,Истина,Истина,Истина);
ПолучитьОшибкиИзХранилища();
Возврат;
КонецЕсли;

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

Попытка
DAO= Новый COMОбъект("DAO.DBEngine.36");
Исключение
Попытка
DAO= Новый COMОбъект("DAO.DBEngine.35");
Исключение
ОбработатьОшибку("Не удалось соединиться с DAO. "+ОписаниеОшибки(),СтатусыСообщения.Важное,Истина,Истина,Истина);
ПолучитьОшибкиИзХранилища();
Возврат;
КонецПопытки;
КонецПопытки;
Сообщить("Соединение с DAO, прошло успешно.",СтатусСообщения.Информация);

Сообщить("Попытка подключиться к Excel, для формирования ячеек.",СтатусСообщения.Информация);
//Перед открытием базы, с помощью DAO, присвоим первым 5 строкам колонок текст, в связи с особенностью DAO
Попытка
ФайлExcel=Новый COMОбъект("Excel.Application");
КнигаExcel = ФайлExcel.WorkBooks;
ExcelОбъект = КнигаExcel.Open(ЭлементыФормы.ИмяФайла.Значение);
Исключение
ОбработатьОшибку("Не удалось открыть Excel. "+ОписаниеОшибки(),СтатусыСообщения.Важное,Истина,Истина,Истина);
ПолучитьОшибкиИзХранилища();
Возврат;
КонецПопытки;

Попытка
Лист = ExcelОбъект.Sheets("POTRN");
Исключение
ОбработатьОшибку("Не удалось найти лист ""POTRN"". "+ОписаниеОшибки(),СтатусыСообщения.Важное,Истина,Истина,Истина);
ПолучитьОшибкиИзХранилища();
Возврат;
КонецПопытки;

ExcelОбъект.CheckCompatibility = Ложь;
ФайлExcel.DisplayAlerts = Ложь;
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Колонка");
ТЗ.Колонки.Добавить("Значение");

НСтрока = ТЗ.Добавить();
НСтрока.Колонка = 1;
НСтрока.Значение = "Строка";

НСтрока = ТЗ.Добавить();
НСтрока.Колонка = 2;
НСтрока.Значение = "Строка";

НСтрока = ТЗ.Добавить();
НСтрока.Колонка = 4;
НСтрока.Значение = "Строка";

НСтрока = ТЗ.Добавить();
НСтрока.Колонка = 5;
НСтрока.Значение = "Строка";

НСтрока = ТЗ.Добавить();
НСтрока.Колонка = 7;
НСтрока.Значение = 0;

Для каждого ТекТЗ Из ТЗ Цикл
Для Строка = 1 ПО 5 Цикл
Лист.Cells(Строка, ТекТЗ.Колонка).Value = ТекТЗ.Значение;
КонецЦикла; 
КонецЦикла; 

КоличествоСтрок = Лист.UsedRange.Rows.Count;

ИмяВременнегоФайла = ЭлементыФормы.ИмяФайла.Значение;
ИмяВременнегоФайла = Сред(ИмяВременнегоФайла,1,СтрДлина(ИмяВременнегоФайла)-4);
ИмяВременнегоФайла = ИмяВременнегоФайла + "_"+".xls";
Сообщить("Сохранение временного файла Excel.",СтатусСообщения.Информация);
Попытка
Лист.SaveAs(ИмяВременнегоФайла,56);
Сообщить("Сохранение прошло успешно.",СтатусСообщения.Информация);
Исключение
ФайлExcel.Quit();
ФайлExcel.Quit();
ОбработатьОшибку("Не удалось сохранить временный файл. "+ОписаниеОшибки(),СтатусыСообщения.Важное,Истина,Истина,Истина);
ПолучитьОшибкиИзХранилища();
Возврат;
КонецПопытки;
ФайлExcel.Quit();
ФайлExcel.Quit();

Сообщить("Попытка открытия базы данных, для выборки.",СтатусСообщения.Информация);
//Открыть базу данных
Попытка
//Для Microsoft Office 2003 и более ранних версий таблиц
db = DAO.Workspaces(0).OpenDatabase(""+ИмяВременнегоФайла+"", 0, 1, "Excel 8.0; HDR=NO;");
Сообщить("Открытие базы данных, прошло успешно.",СтатусСообщения.Информация);
Исключение
ОбработатьОшибку("Не удалось открыть базу данных. "+ОписаниеОшибки(),СтатусыСообщения.Важное,Истина,Истина,Истина);
ПолучитьОшибкиИзХранилища();
Возврат;
КонецПопытки;

//Получить записи
Recordset = Db.OpenRecordset("SELECT [f1],[f2],[f4],[f5],[f7] FROM [POTRN$A1:G"+СтрЗаменить(Строка(КоличествоСтрок),Символы.НПП,"")+"]");

МассивС = Новый Массив;
МассивС.Добавить(Тип("Строка"));

МассивЧ = Новый Массив;
МассивЧ.Добавить(Тип("Число"));

ОписаниеТиповС = Новый ОписаниеТипов(МассивС,,Новый КвалификаторыСтроки(255));
ОписаниеТиповЧ = Новый ОписаниеТипов(МассивЧ);
ОписаниеТиповС_ = Новый ОписаниеТипов(МассивС,,Новый КвалификаторыСтроки(10));
ОписаниеТиповС20 = Новый ОписаниеТипов(МассивС,,Новый КвалификаторыСтроки(20));
ОписаниеТиповС15 = Новый ОписаниеТипов(МассивС,,Новый КвалификаторыСтроки(15));

ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("НомерСтр",ОписаниеТиповЧ);
ТаблицаЗначений.Колонки.Добавить("f1",ОписаниеТиповС);
ТаблицаЗначений.Колонки.Добавить("f2",ОписаниеТиповС20);
ТаблицаЗначений.Колонки.Добавить("f4",ОписаниеТиповС_);
ТаблицаЗначений.Колонки.Добавить("f5",ОписаниеТиповС15);
ТаблицаЗначений.Колонки.Добавить("f7",ОписаниеТиповЧ);

Сообщить("Добавление данных во временную таблицу, для последующего использования и обработки.",СтатусСообщения.Информация);
ОбработатьОшибку("Сканирование файла " +ЭлементыФормы.ИмяФайла.Значение+ ", выполено " + ТекущаяДата(),СтатусыСообщения.Информация);
СчетчикСтрок = 1;
Пока НЕ Recordset.eof Цикл
Строка = ТаблицаЗначений.Добавить();
Строка.НомерСтр = СчетчикСтрок;
Строка.f1 = Строка(Recordset.f1.value);
Попытка
Строка.f2 = Строка(Recordset.f2.value);
Исключение
ОбработатьОшибку("При обработке данных из файла не удалось определить код ТМЦ.
| Номер строки в файле " + СчетчикСтрок,СтатусыСообщения.ОченьВажное);
Строка.f2 = "";
КонецПопытки;
Строка.f4 = Строка(Recordset.f4.value);

Попытка
Строка.f5 = СокрЛП(Строка(Recordset.f5.value));
Исключение
ОбработатьОшибку("При обработке данных из файла не удалось определить код заказа.
| Номер строки в файле " + СчетчикСтрок,СтатусыСообщения.ОченьВажное);
Строка.f5 = "";
КонецПопытки;

Попытка
Строка.f7 = Число(Recordset.f7.value);
Исключение
ОбработатьОшибку("При обработке данных из файла не удалось определить потребность.
| Номер строки в файле " + СчетчикСтрок,СтатусыСообщения.ОченьВажное);
Строка.f7 = 0;
КонецПопытки;
СчетчикСтрок = СчетчикСтрок + 1;
Recordset.MoveNext();
КонецЦикла;

Сообщить("Данные добавленны во временную таблицу.",СтатусСообщения.Информация);

Запрос = Новый Запрос;

МВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МВТ;
ТекстМВТ = "ВЫБРАТЬ
|	ТаблицаЗначений.НомерСтр КАК НомерСтр,
|	ТаблицаЗначений.f1 КАК ТипТМЦ,
|	ТаблицаЗначений.f2 КАК КодТМЦ,
|	ТаблицаЗначений.f4 КАК ЕдиницаИзмерения,
|	ТаблицаЗначений.f5 КАК КодЗаказа,
|	ТаблицаЗначений.f7 КАК Потребность
|ПОМЕСТИТЬ ВР_ИсходнаяТаблица
|ИЗ
|	&ТаблицаЗначений КАК ТаблицаЗначений";
Запрос.УстановитьПараметр("ТаблицаЗначений",ТаблицаЗначений);
ВР_МВТ_ТаблицаЗначений = ТаблицаЗначений.Скопировать();
Запрос.Текст = ТекстМВТ;
Запрос.Выполнить();

Запрос.Текст = "ВЫБРАТЬ
|	ТаблицаЗначений.НомерСтр КАК НомерСтр,
|	ТаблицаЗначений.ТипТМЦ КАК ТипТМЦ,
|	ТаблицаЗначений.КодТМЦ КАК КодТМЦ,
|	ТаблицаЗначений.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	ТаблицаЗначений.КодЗаказа КАК КодЗаказа,
|	ТаблицаЗначений.Потребность КАК Потребность
|ПОМЕСТИТЬ ИсходнаяТаблица
|ИЗ
|	(ВЫБРАТЬ
|		МИНИМУМ(ТаблицаЗначений.НомерСтр) КАК НомерСтр,
|		ТаблицаЗначений.ТипТМЦ КАК ТипТМЦ,
|		ТаблицаЗначений.КодТМЦ КАК КодТМЦ,
|		ТаблицаЗначений.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|		ТаблицаЗначений.КодЗаказа КАК КодЗаказа,
|		СУММА(ТаблицаЗначений.Потребность) КАК Потребность
|	ИЗ
|		ВР_ИсходнаяТаблица КАК ТаблицаЗначений
|	
|	СГРУППИРОВАТЬ ПО
|		ТаблицаЗначений.ТипТМЦ,
|		ТаблицаЗначений.КодТМЦ,
|		ТаблицаЗначений.ЕдиницаИзмерения,
|		ТаблицаЗначений.КодЗаказа) КАК ТаблицаЗначений
|ГДЕ
|	ТаблицаЗначений.КодЗаказа <> """"
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|	ЗначенияСвойствОбъектов.Значение.Наименование КАК КодАвтокрана,
|	Номенклатура.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВР_ТаблицаНоменклатуры
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|		ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
|ГДЕ
|	ЗначенияСвойствОбъектов.Свойство.Код = ""М0000000001""
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|	АналогиНоменклатуры.КодАвтокрана
|ПОМЕСТИТЬ ВР_АналогиНоменклатуры
|ИЗ
|	(ВЫБРАТЬ
|		ТаблицаНоменклатуры.КодАвтокрана КАК КодАвтокрана
|	ИЗ
|		ВР_ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
|	
|	ОБЪЕДИНИТЬ
|	
|	ВЫБРАТЬ
|		АналогиНоменклатурыExcelСрезПоследних.КодExcel
|	ИЗ
|		РегистрСведений.АналогиНоменклатурыExcel.СрезПоследних(&Срез, ) КАК АналогиНоменклатурыExcelСрезПоследних) КАК АналогиНоменклатуры
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	АналогиНоменклатуры.КодАвтокрана,
|	ТаблицаНоменклатуры.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВР_ПромежуточнаяТаблица
|ИЗ
|	ВР_АналогиНоменклатуры КАК АналогиНоменклатуры
|		ЛЕВОЕ СОЕДИНЕНИЕ ВР_ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
|		ПО (ТаблицаНоменклатуры.КодАвтокрана = АналогиНоменклатуры.КодАвтокрана)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	Результат.КодАвтокрана,
|	Результат.Номенклатура КАК Ссылка
|ПОМЕСТИТЬ ВР_КодыАвтокрана
|ИЗ
|	(ВЫБРАТЬ
|		ПромежуточнаяТаблица.КодАвтокрана КАК КодАвтокрана,
|		ВЫБОР
|			КОГДА ПромежуточнаяТаблица.Номенклатура ЕСТЬ NULL 
|				ТОГДА АналогиНоменклатуры.Номенклатура
|			ИНАЧЕ ПромежуточнаяТаблица.Номенклатура
|		КОНЕЦ КАК Номенклатура
|	ИЗ
|		ВР_ПромежуточнаяТаблица КАК ПромежуточнаяТаблица
|			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналогиНоменклатурыExcel.СрезПоследних(&Срез, ) КАК АналогиНоменклатуры
|			ПО (АналогиНоменклатуры.КодExcel = ПромежуточнаяТаблица.КодАвтокрана)) КАК Результат
|ГДЕ
|	(НЕ Результат.Номенклатура ЕСТЬ NULL )
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ИсходнаяТаблица.НомерСтр КАК НомерСтр,
|	ИсходнаяТаблица.ТипТМЦ КАК ТипТМЦ,
|	ИсходнаяТаблица.КодТМЦ КАК КодТМЦ,
|	ИсходнаяТаблица.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	ИсходнаяТаблица.КодЗаказа КАК КодЗаказа,
|	ИсходнаяТаблица.Потребность КАК Потребность,
|	ПроизводимыеИзделияЗаводов.НоменклатурнаяГруппаИзделия КАК НоменклатурнаяГруппаИзделия,
|	ПроизводимыеИзделияЗаводов.Ссылка КАК Ссылка,
|	СУММА(0) КАК Материалы
|ИЗ
|	ИсходнаяТаблица КАК ИсходнаяТаблица
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПроизводимыеИзделияЗаводов КАК ПроизводимыеИзделияЗаводов
|		ПО ИсходнаяТаблица.КодТМЦ = ПроизводимыеИзделияЗаводов.ЗаводскойКодКлючевойНоменклатуры
|			И ИсходнаяТаблица.КодЗаказа = ПроизводимыеИзделияЗаводов.КодПроизводственногоЗаказа
|
|СГРУППИРОВАТЬ ПО
|	ИсходнаяТаблица.НомерСтр,
|	ИсходнаяТаблица.ТипТМЦ,
|	ИсходнаяТаблица.КодТМЦ,
|	ИсходнаяТаблица.ЕдиницаИзмерения,
|	ИсходнаяТаблица.КодЗаказа,
|	ИсходнаяТаблица.Потребность,
|	ПроизводимыеИзделияЗаводов.Ссылка,
|	ПроизводимыеИзделияЗаводов.НоменклатурнаяГруппаИзделия
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	ИсходнаяТаблица.НомерСтр,
|	ИсходнаяТаблица.ТипТМЦ,
|	ИсходнаяТаблица.КодТМЦ,
|	ИсходнаяТаблица.ЕдиницаИзмерения,
|	ИсходнаяТаблица.КодЗаказа,
|	ИсходнаяТаблица.Потребность,
|	NULL,
|	Номенклатура.Ссылка,
|	1
|ИЗ
|	ИсходнаяТаблица КАК ИсходнаяТаблица
|		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|			ВР_КодыАвтокрана.КодАвтокрана КАК КодАвтокрана,
|			ВР_КодыАвтокрана.Ссылка КАК Ссылка
|		ИЗ
|			ВР_КодыАвтокрана КАК ВР_КодыАвтокрана) КАК Номенклатура
|		ПО (Номенклатура.КодАвтокрана = ИсходнаяТаблица.КодТМЦ)";
Запрос.УстановитьПараметр("Срез",Дата);

Сообщить("Выполняется обработка полученных данных.",СтатусСообщения.Информация);

РезультатЗП = Запрос.Выполнить().Выгрузить();
КоличествоДляОбработки = РезультатЗП.Количество();
Обработано = 1;

ТаблицаНеНайденных = Новый ТаблицаЗначений;
ТаблицаНеНайденных.Колонки.Добавить("КодТМЦ");

ОбязательныеРеквизитыШапки = "Организация,Контрагент,ДоговорМатериалы, ДоговорКомплектующие, Период";
Структура = Новый Структура(ОбязательныеРеквизитыШапки,Организация,Контрагент,ДоговорМатериалы,Дог
оворКомплектующие, Период);

Для Каждого Текстрока ИЗ Структура Цикл
Если Не ЗначениеЗаполнено(Текстрока.Значение) Тогда
Сообщить("Не заполнено значение "+""""+ЭтотОбъект.Метаданные().Реквизиты[Текстрока.Ключ].Синоним+"""" + "
|Поиск заказов может выполняться не корректно.", СтатусСообщения.Внимание);
КонецЕсли; 
КонецЦикла;

Для каждого Тек_ВР Из РезультатЗП Цикл
Состояние("Обработано данных (" + Обработано + " из " + КоличествоДляОбработки + ")");
Обработано = Обработано + 1;

Если Тек_ВР.Ссылка = NULL Тогда
Если Тек_ВР.КодЗаказа = "Строка" ИЛИ Тек_ВР.КодТМЦ = "Строка" Тогда
Продолжить;
КонецЕсли; 
ВР_НП = ТаблицаНеНайденных.Добавить();
ВР_НП.КодТМЦ = Тек_ВР.КодТМЦ;
//ОбработатьОшибку("Не найдена номенклатура!
//				| Номер строки в файле " + Тек_ВР.НомерСтр + ", код заказа " + Тек_ВР.КодЗаказа + ", код ТМЦ "+ Тек_ВР.КодТМЦ,СтатусыСообщения.ОченьВажное);
продолжить;
КонецЕсли; 

ЗапросСоответсвий = Новый Запрос;
ЗапросСоответсвий.Текст = "ВЫБРАТЬ
|	СоответствиеЕдиницИзмерения.ЕдиницаПоКлассификатору
|ИЗ
|	РегистрСведений.СоответствиеЕдиницИзмерения КАК СоответствиеЕдиницИзмерения
|ГДЕ
|	СоответствиеЕдиницИзмерения.ЕдиницаТекст = &ЕдиницаТекст";
ЗапросСоответсвий.УстановитьПараметр("ЕдиницаТекст",Тек_ВР.ЕдиницаИзмерения);
РезультатСоответствия = ЗапросСоответсвий.Выполнить().Выбрать();

ЕдиницаПоКлассификатору = Новый Массив;
ЕдиницПоКлассификатору = "";
Если РезультатСоответствия.Количество() = 0 Тогда
ОбработатьОшибку("Не найдена единица измерения по классификатору, текстовая единица представленна в виде: "+ Тек_ВР.ЕдиницаИзмерения + "
| Номер строки в файле " + Тек_ВР.НомерСтр + ", код заказа " + Тек_ВР.КодЗаказа + ", код ТМЦ "+ Тек_ВР.КодТМЦ+", код на справочник "+ ?(Тек_ВР.Материалы = 0,"производимые изделия заводов ", "номенклатуры ") + Тек_ВР.Ссылка.Код,СтатусыСообщения.Внимание);
продолжить;
Иначе	
Пока РезультатСоответствия.Следующий() Цикл
ЕдиницаПоКлассификатору.Добавить(РезультатСоответствия.ЕдиницаПоКлассификатору.С
сылка);
ЕдиницПоКлассификатору = ЕдиницПоКлассификатору + РезультатСоответствия.ЕдиницаПоКлассификатору.Наименование +", ";
КонецЦикла;
КонецЕсли; 
ЕдиницПоКлассификатору = Сред(ЕдиницПоКлассификатору,1,СтрДлина(ЕдиницПоКлассификатору)-2);

ЗапросЕдиниц = Новый Запрос;
ЗапросЕдиниц.Текст = "ВЫБРАТЬ
|	ЕдиницыИзмерения.Ссылка
|ИЗ
|	Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
|	ЕдиницыИзмерения.Владелец = &Владелец
|	И ЕдиницыИзмерения.ЕдиницаПоКлассификатору В (&ЕдиницаПоКлассификатору)";
Если Тек_ВР.Материалы = 0 Тогда
ЗапросЕдиниц.УстановитьПараметр("Владелец",Тек_ВР.Ссылка.КлючеваяНоменклатура.Ссылка);
Иначе
ЗапросЕдиниц.УстановитьПараметр("Владелец",Тек_ВР.Ссылка.Ссылка);
КонецЕсли; 
ЗапросЕдиниц.УстановитьПараметр("ЕдиницаПоКлассификатору",ЕдиницаПоКлассификатору);

ЕдиницыИзмерения = ЗапросЕдиниц.Выполнить().Выгрузить();

Если ЕдиницыИзмерения.Количество() = 0 Тогда
ОбработатьОшибку("Для номенклатуры "+?(Тек_ВР.Материалы = 0,Тек_ВР.Ссылка.КлючеваяНоменклатура, Тек_ВР.Ссылка)+ " не найдена единица измерения по классификатору (" + ЕдиницПоКлассификатору + "). 
| Номер строки в файле " + Тек_ВР.НомерСтр + ", код заказа " + Тек_ВР.КодЗаказа + ", код ТМЦ "+ Тек_ВР.КодТМЦ,СтатусыСообщения.Внимание);
Продолжить;
КонецЕсли; 

Если ЕдиницыИзмерения.Количество() > 1 Тогда
ОбработатьОшибку("Для номенклатуры "+?(Тек_ВР.Материалы = 0,Тек_ВР.Ссылка.КлючеваяНоменклатура, Тек_ВР.Ссылка)+ " найдено "+ ЕдиницыИзмерения.Количество() +" единиц измерения по классификатору (" + ЕдиницПоКлассификатору+"). 
| Номер строки в файле " + Тек_ВР.НомерСтр + ", код заказа " + Тек_ВР.КодЗаказа + ", код ТМЦ "+ Тек_ВР.КодТМЦ,СтатусыСообщения.Обычное);
КонецЕсли; 

Если Тек_ВР.Материалы = 0 Тогда
Количество = ?(Тек_ВР.Ссылка.КоличествоКлючевойНоменклатуры=0,1,Тек_ВР.Ссылка.КоличествоКлю
чев
ойНоменклатуры);
НоваяСтрока = СоставЗакачки.Добавить();
НоваяСтрока.КоличествоВФайле	 = Тек_ВР.Потребность / (Количество * Тек_ВР.Ссылка.ЕдИзмКлючевойНоменклатуры.Коэффициент/ЕдиницыИзмерения[0].Ссылка.Коэффициент);
НоваяСтрока.НоменклатурнаяГруппа = Тек_ВР.Ссылка.НоменклатурнаяГруппаИзделия;
НоваяСтрока.КоличествоКЗакачке  = НоваяСтрока.КоличествоВФайле;
НоваяСтрока.Номенклатура		 = Тек_ВР.Ссылка.НоменклатураИзделия;
НоваяСтрока.ПроизводимыеИзделияЗаводов	= Тек_ВР.Ссылка;
НоваяСтрока.Потребность				  = Тек_ВР.Потребность;

НомерЗаказаМ = "А" + НоваяСтрока.ПроизводимыеИзделияЗаводов.КодПроизводственногоЗаказа + "М"+Месяц(Период);
НомерЗаказаК = "А" + НоваяСтрока.ПроизводимыеИзделияЗаводов.КодПроизводственногоЗаказа + "К"+Месяц(Период);
Запрос.Текст = "ВЫБРАТЬ
|	ЕСТЬNULL(ЗаказПокупателя.Ссылка, ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)) КАК Заказ
|ИЗ
|	Документ.ЗаказПокупателя КАК ЗаказПокупателя
|ГДЕ
|	ЗаказПокупателя.Номер = &Номер
|	И ЗаказПокупателя.ПометкаУдаления = ЛОЖЬ
|	И ВЫБОР
|			КОГДА ЗаказПокупателя.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяССылка)
|				ТОГДА ЗаказПокупателя.Организация = &Организация
|			ИНАЧЕ ИСТИНА
|		КОНЕЦ
|	И ВЫБОР
|			КОГДА ЗаказПокупателя.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)
|				ТОГДА ЗаказПокупателя.Контрагент = &Контрагент
|			ИНАЧЕ ИСТИНА
|		КОНЕЦ
|	И ВЫБОР
|			КОГДА ЗаказПокупателя.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяССылка)
|				ТОГДА ЗаказПокупателя.ДоговорКонтрагента = &ДоговорКонтрагента
|			ИНАЧЕ ИСТИНА
|		КОНЕЦ";
Запрос.УстановитьПараметр("Организация",Организация);
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Запрос.УстановитьПараметр("Номер",НомерЗаказаМ);
Запрос.УстановитьПараметр("ДоговорКонтрагента",ДоговорМатериалы);

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда
НоваяСтрока.ЗаказМатериалы = Результат.Заказ;
КонецЕсли; 

Запрос.УстановитьПараметр("Номер",НомерЗаказаК);
Запрос.УстановитьПараметр("ДоговорКонтрагента",ДоговорКомплектующие);

Результат = Запрос.Выполнить().Выбрать();

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

КонецЦикла;

ТаблицаНеНайденных.Свернуть("КодТМЦ");

Для каждого ТекСтрока Из ТаблицаНеНайденных Цикл
ОбработатьОшибку("Не найдена номенклатура по коду "+ ТекСтрока.КодТМЦ,СтатусыСообщения.ОченьВажное);
КонецЦикла; 

Сообщить("Выполняется очищение соединений.",СтатусСообщения.Информация);
Recordset.Close();
db.Close();

ВыбФайл = Новый Файл(ИмяВременнегоФайла);
Если ВыбФайл.Существует() Тогда
ВыбФайл.УстановитьТолькоЧтение(ЛОЖЬ);
КонецЕсли; 

Сообщить("Выполняется удаление временного файла.",СтатусСообщения.Информация);
Попытка
УдалитьФайлы(ВыбФайл.ПолноеИмя); 
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

ТаблицаЗначений.Свернуть("f5","");
РезультатЗП.Свернуть("КодЗаказа,Материалы","");

Для каждого ТекСтрока Из ТаблицаЗначений Цикл
СуществуетЗаказ = Ложь;
Для каждого ТекСтрокаЗП Из РезультатЗП Цикл
Если ТекСтрокаЗП.КодЗаказа = ТекСтрока.f5 И (ТекСтрокаЗП.Материалы = 0 ИЛИ ТекСтрока.f5 = "Строка" ИЛИ ТекСтрока.f5 = "") Тогда
СуществуетЗаказ = Истина;
Прервать;
КонецЕсли; 
КонецЦикла; 

Если НЕ СуществуетЗаказ Тогда
ОбработатьОшибку("В справочнике производимые изделия заводов не удалось найти код заказа "+ТекСтрока.f5,СтатусыСообщения.Важное);
КонецЕсли; 

КонецЦикла; 

//ТекстЗапpoca = " 
//| УНИЧТОЖИТЬ ВР_ИсходнаяТаблица
//|";
//
//Запрос.Текст = ТекстЗапpoca; 
//Запрос.Выполнить();

//Запрос.Текст = ТекстМВТ;
//Запрос.УстановитьПараметр("ТаблицаЗначений",ВР_МВТ_ТаблицаЗначений);
//Запрос.Выполнить();
//
//Запрос.Текст = "ВЫБРАТЬ
//			  				  |	ТаблицаЗначений.НомерСтр КАК НомерСтр,
//			  				  |	ТаблицаЗначений.ТипТМЦ КАК ТипТМЦ,
//			  				  |	ТаблицаЗначений.КодТМЦ КАК КодТМЦ,
//			  				  |	ТаблицаЗначений.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
//			  				  |	ТаблицаЗначений.КодЗаказа КАК КодЗаказа,
//			  				  |	ТаблицаЗначений.Потребность КАК Потребность,
//			  				  |	ПроизводимыеИзделияЗаводов.Ссылка
//			  				  |ИЗ
//			  				  |	(ВЫБРАТЬ
//			  				  |		МИНИМУМ(ТаблицаЗначений.НомерСтр) КАК НомерСтр,
//			  				  |		ТаблицаЗначений.ТипТМЦ КАК ТипТМЦ,
//			  				  |		ТаблицаЗначений.КодТМЦ КАК КодТМЦ,
//			  				  |		ТаблицаЗначений.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
//			  				  |		ТаблицаЗначений.КодЗаказа КАК КодЗаказа,
//			  				  |		СУММА(ТаблицаЗначений.Потребность) КАК Потребность
//			  				  |	ИЗ
//			  				  |		ВР_ИсходнаяТаблица КАК ТаблицаЗначений
//			  				  |	
//			  				  |	СГРУППИРОВАТЬ ПО
//			  				  |		ТаблицаЗначений.ТипТМЦ,
//			  				  |		ТаблицаЗначений.КодТМЦ,
//			  				  |		ТаблицаЗначений.ЕдиницаИзмерения,
//			  				  |		ТаблицаЗначений.КодЗаказа) КАК ТаблицаЗначений
//			  				  |		ПРАВОЕ СОЕДИНЕНИЕ Справочник.ПроизводимыеИзделияЗаводов КАК ПроизводимыеИзделияЗаводов
//			  				  |		ПО ТаблицаЗначений.КодТМЦ = ПроизводимыеИзделияЗаводов.ЗаводскойКодКлючевойНоменклатуры
//			  				  |			И ТаблицаЗначений.КодЗаказа = ПроизводимыеИзделияЗаводов.КодПроизводственногоЗаказа";
//
//ТаблицаНеНайденныхЗаказов = Запрос.Выполнить().Выгрузить();
//Для каждого ТекПозиция Из ТаблицаНеНайденныхЗаказов Цикл
//	Если ТекПозиция.КодТМЦ = "КодТМЦ" ИЛИ ТекПозиция.КодТМЦ = "" ИЛИ ТекПозиция.КодЗаказа = "КодТМЦ" ИЛИ ТекПозиция.КодЗаказа = "" Тогда
//		Продолжить;
//	КонецЕсли;
//		ОбработатьОшибку("В справочнике производимые изделия заводов не удалось найти код заказа: "+ ТекПозиция.КодЗаказа + ", и код ключевой номенклатуры: "+ТекПозиция.КодТМЦ,СтатусыСообщения.Важное);
//КонецЦикла; 

Если СоставЗакачки.Количество() > 0 Тогда
ЭлементыФормы.Материалы.ОтборСтрок.КодЗаказа.Установить(СоставЗакачки[0].Произво
димыеИзделияЗаводов.КодПроизводственногоЗаказа);
КонецЕсли; 
СохранитьОшибкиВХранилище();
ВывестиОшибки();
КонецПроцедуры

Всем! Делаю китайское предупреждение: за НЕ включение таких кусков кода в спойлеры буду нещадно раздавать горчичники. Заодно напоминаю, что код тоже обрамляется соответствующими тегами!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!