Немножко предыстории.
Все началось с того, что сломался очередной жесткий диск и, как всегда, копий нет. Но есть рабочая касса под руководством программы FRONTOL 4 и нужно быстро реанимировать 1С хотя бы в части справочника номенклатуры, ну и цен соответственно.
Учет ведется в программе Далион:УНО (ПРО, Сеть)
Для того, чтобы все это осуществить, нам понадобится программа, которая умеет экспортировать из базы данных INTERBASE/FIRIBERD в Exсel или DBF, я использовал вот такую:
IBExpert (http://www.ibexpert.net/ibe/index.php) (не спрашивайте, где брать не демо).
- Экспортируем следующие таблицы: SPRT — SPRT.DBF, PRICEDATA — PRICEDAT.DBF, BARCODE — BARCODE.DBF, REMAIN — REMAIN.DBF (для тех, кто использует сложные разрезы цен, думайте сами)
- Восстанавливаем чистую базу из шаблона или другим способом
- Запускаем обработку указываем ей каталог (жестко прописан, выбор не работает).
- После всего этого работать будет все, кроме выгрузки в кассу.
Чтобы заработала выгрузка в кассу, нужно или заново перезаписать каждую группу, или написать обработку, которая заполнит регистр сведений «АссортиментСкладов»
Для всех, кто будет просить скачать ему обработку у друзей, привожу ее полный код. Не ленитесь, господа.
Функция ОткрытьТаблицуDBF(ИмяТаблицы)
xbase = Новый xBase; xBase.ОткрытьФайл(ИмяТаблицы);
Если xBase.Открыта() Тогда Возврат xBase; иначе Возврат Неопределено; КонецЕсли;
КонецФункции
Процедура СкопироватьxBaseВТЗ(xBase,ТЗн)
xBase.Первая();
Пока НЕ xBase.вКонце() Цикл
НоваяСтрока = ТЗн.Добавить();ЗаполнитьЗначенияСвойств(НоваяСтрока,xBase); xBase.Следующая();
КонецЦикла;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
xBaseТовары = ОткрытьТаблицуDBF(СокрЛП(КаталогТаблиц)+"SPRT.DBF");
xBaseШтрихКоды = ОткрытьТаблицуDBF(СокрЛП(КаталогТаблиц)+"BARCODE.DBF");
xBaseЦены = ОткрытьТаблицуDBF(СокрЛП(КаталогТаблиц)+"PRICEDAT.DBF");
xBaseЦеныОстатка = ОткрытьТаблицуDBF(СокрЛП(КаталогТаблиц)+"REMAIN.DBF");
Если xBaseТовары=Неопределено или xBaseШтрихКоды =Неопределено или
xBaseЦены =Неопределено или xBaseЦеныОстатка =Неопределено Тогда
Сообщить("не могу открыть таблицы SPRT.DBF BARCODE.DBF PRICEDAT.DBF REMAIN.DBF");
Возврат;
КонецЕсли;
ТзнШтрихКоды = Новый таблицаЗначений;
ТзнШтрихКоды.Колонки.Добавить("ID",Новый ОписаниеТипов("Число"));
ТзнШтрихКоды.Колонки.Добавить("WareID",Новый ОписаниеТипов("Число"));
ТзнШтрихКоды.Колонки.Добавить("Barcode",Новый ОписаниеТипов("Строка"));
ТзнШтрихКоды.Колонки.Добавить("Factor",Новый ОписаниеТипов("Число"));
ТзнЦены = Новый таблицаЗначений;
ТзнЦены.Колонки.Добавить("ID",Новый ОписаниеТипов("Число"));
ТзнЦены.Колонки.Добавить("Price",Новый ОписаниеТипов("Число"));
ТзнЦены.Колонки.Добавить("RemainID",Новый ОписаниеТипов("Число")); //брать из таблице remain поле ID
ТзнЦеныОстатка = Новый таблицаЗначений;
ТзнЦеныОстатка.Колонки.Добавить("ID",Новый ОписаниеТипов("Число"));
ТзнЦеныОстатка.Колонки.Добавить("WareID",Новый ОписаниеТипов("Число"));
ТзнТовары = Новый ТаблицаЗначений;
ТзнТовары.Колонки.Добавить("ID",Новый ОписаниеТипов("Число"));
ТзнТовары.Колонки.Добавить("PARENTID",Новый ОписаниеТипов("Число"));
ТзнТовары.Колонки.Добавить("Code",Новый ОписаниеТипов("Число"));
ТзнТовары.Колонки.Добавить("Name",Новый ОписаниеТипов("Строка"));
ТзнТовары.Колонки.Добавить("Text",Новый ОписаниеТипов("Строка"));
ТзнТовары.Колонки.Добавить("Flags",Новый ОписаниеТипов("Число")); //Flags = //9727 весовой товар
//9726 - обычный товар 254 - группа
ТзнТовары.Колонки.Добавить("IsWare",Новый ОписаниеТипов("Число")); // 1- Товар
ТзнТовары.Колонки.Добавить("Номенклатура",Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
СкопироватьxBaseВТЗ(xBaseШтрихКоды,ТзнШтрихКоды);
СкопироватьxBaseВТЗ(xBaseЦены,ТзнЦены);
СкопироватьxBaseВТЗ(xBaseЦеныОстатка,ТзнЦеныОстатка);
Начатьтранзакцию();
ДокАкт = Документы.АктПереоценки.СоздатьДокумент();
ДокАкт.Дата = Рабочаядата;
ЗаполнитьШапкуДокумента(ДокАкт, ПараметрыСеанса.ТекущийПользователь);
ДокАкт.ВидОперации = Перечисления.ВидыОперацийАктПереоценки.Переоценка;
ДокАкт.ТОСоздания = ПараметрыСеанса.ТекущийТО;
УстановитьНомерДокумента(ДокАкт.ЭтотОбъект);
ДокАкт.ЗаписыватьРасценку = УправлениеРИБ.ТребуетсяПодтверждениеПереоценки(ДокАкт);
xBaseТовары.Первая();
Пока НЕ xBaseТовары.вКонце() Цикл
НоваяСтрока = ТзнТОвары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,xBaseТовары);
Если xBaseТовары.IsWare<>1 Тогда
НовЭлем = Справочники.Номенклатура.СоздатьГруппу();
НовЭлем.Код = xBaseТовары.Code;
НовЭлем.Наименование = xBaseТовары.Name;
НовЭлем.Записать();
НоваяСтрока.Номенклатура = НовЭлем.Ссылка; // для идетификации групп
Если xBaseТовары.PARENTID <> 0 Тогда
НайденаяГруппа = ТзнТовары.Найти(xBaseТовары.PARENTID,"ID" );
Если НЕ НайденаяГруппа=неопределено Тогда
НовЭлем.Родитель =НайденаяГруппа.Номенклатура;
НовЭлем.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли;
xBaseТовары.Следующая();
КонецЦикла;
Для каждого СтрокаТзн Из ТзнТОвары Цикл
Если СтрокаТзн.IsWare <> 1 Тогда
Продолжить;
КонецЕсли;
НовЭлем = Справочники.Номенклатура.СоздатьЭлемент();
НовЭлем.Код = СтрокаТзн.Code;
НовЭлем.Наименование = СтрокаТзн.Name;
НовЭлем.НаименованиеПолное = СтрокаТзн.Text;
НовЭлем.КатегорияТовара = Справочники.КатегорииТоваров.УчетПоХарактеристикамНеВедется;
Если Константы.УстанавливатьПроизводителяПоШК.Получить() Тогда
НовЭлем.Производитель = Справочники.КлассификаторСтранМира.ПустаяСсылка();
ИначеЕсли Не ЗначениеЗаполнено(НовЭлем.Производитель) Тогда
НовЭлем.Производитель = Константы.ОсновнойПроизводитель.Получить();
КонецЕсли;
НовЭлем.СтавкаНДС = Константы.ОсновнаяСтавкаНДС.Получить();
НовЭлем.ФирмаФР = Константы.УправленческаяФирма.Получить();
НовЭлем.ГруппаТоваровДляПривязкиКФР = Справочники.ГруппыТоваровДляПривязкиКФР.ОсновнаяГруппаТоваров;
НовЭлем.ОсновноеИзображение = Справочники.ХранилищеДополнительнойИнформации.ПустаяСсылка();
Если СтрокаТзн.Flags=9726 Тогда
БазоваяЕдиницаОКЕИ = Константы.ОсновнаяЕдиницаОКЕИ.Получить();
ИначеЕсли СтрокаТзн.Flags=9727 Тогда
БазоваяЕдиницаОКЕИ = Константы.ОсновнаяЕдиницаОКЕИВес.Получить();
НовЭлем.ВыгружатьВВесы = истина;
НовЭлем.РазрешеноДробноеКоличество = истина;
НовЭлем.ШтрихКодВключаетКоличество = истина;
Иначе
БазоваяЕдиницаОКЕИ = Константы.ОсновнаяЕдиницаОКЕИ.Получить();
КонецЕсли;
НовЭлем.ОбменДанными.Загрузка = Истина; //чтоб дал записать единицы измерения
НовЭлем.Записать();
НовЕдиница = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
НовЕдиница.Владелец = НовЭлем.Ссылка;
НовЕдиница.ЕдиницаПоКлассификатору = БазоваяЕдиницаОКЕИ;
НовЕдиница.Наименование = БазоваяЕдиницаОКЕИ;
НовЕдиница.Коэффициент = 1;
НовЕдиница.Записать();
НовЭлем.БазоваяЕдиницаИзмерения = НовЕдиница.Ссылка;
НовЭлем.ЕдиницаИзмеренияОтчетов = НовЕдиница.Ссылка;
НовЭлем.ЕдиницаИзмеренияЗаказов = НовЕдиница.Ссылка;
НовЭлем.Записать();
СтрокаТзн.Номенклатура = НовЭлем.Ссылка;
Если СтрокаТзн.PARENTID <> 0 Тогда
НайденаяГруппа = ТзнТовары.Найти(СтрокаТзн.PARENTID,"ID" );
Если НЕ НайденаяГруппа=неопределено Тогда
НовЭлем.Родитель =НайденаяГруппа.Номенклатура;
НовЭлем.Записать();
КонецЕсли;
КонецЕсли;
НайденныеШтрихКоды = ТзнШтрихКоды.НайтиСтроки(Новый Структура("WareID",СтрокаТзн.ID));
Для каждого СтрокаШтрихКод Из НайденныеШтрихКоды Цикл
НаборЗаписей = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ШтрихКод.Установить(СокрЛП(СтрокаШтрихКод.Barcode));
НаборЗаписей.Отбор.Номенклатура.Установить(НовЭлем.Ссылка);
НаборЗаписей.Записать();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Номенклатура = НовЭлем.Ссылка;
НоваяЗапись.Штрихкод = СокрЛП(СтрокаШтрихКод.Barcode);
НоваяЗапись.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
Новаязапись.ЕдиницаИзмерения= НовЭлем.БазоваяЕдиницаИзмерения;
НаборЗаписей.Записать();
КонецЦикла;
//самое трудное
найденыйостатокЦены = ТзнЦеныОстатка.Найти(СтрокаТзн.ID,"WareID");
Если НЕ найденыйостатокЦены = Неопределено Тогда
НайденнаяЦена = ТзнЦены.найти(найденыйостатокЦены.ID,"RemainID");
НоваяЦена = ДокАкт.Товары.Добавить();
НоваяЦена.Номенклатура = НовЭлем.Ссылка;
НоваяЦена.Цена = НайденнаяЦена.Price;
//Сообщить("найденая цена "+СтрокаТзн.Code+" "+СтрокаТзн.Name+" "+НайденнаяЦена.Price);
КонецЕсли;
КонецЦикла;
ДокАкт.Записать(РежимЗаписиДокумента.Запись);
ЗафиксироватьТранзакцию();
КонецПроцедуры
Процедура КаталогТаблицНачалоВыбора(Элемент, СтандартнаяОбработка)
КонецПроцедуры
КаталогТаблиц = "D:Supermarket";
ВОТ ТАК И ЗАКОНЧИЛИСЬ ОЧЕРЕДНЫЕ БЕССОННЫЕ ВЫХОДНЫЕ.
Доработок не будет.
Спасибо, помогло раскрутить связку tranzt-sprt-remain-pricedata при построении запроса.
P.S. Кстати да, а чего ADODB и запросы не юзаешь-то? Зачем этот изврат с DBF?