Бегство из Frontol в Далион или очередной день программиста

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

Немножко предыстории.

Все началось с того, что сломался очередной жесткий диск и, как всегда, копий нет. Но есть рабочая касса под руководством программы FRONTOL 4 и нужно быстро реанимировать 1С хотя бы в части справочника номенклатуры, ну и цен соответственно.

Учет ведется в программе Далион:УНО (ПРО, Сеть)

Для того, чтобы все это осуществить, нам понадобится программа, которая умеет экспортировать из базы данных INTERBASE/FIRIBERD в Exсel или DBF,  я использовал вот такую:

IBExpert (http://www.ibexpert.net/ibe/index.php) (не спрашивайте, где брать не демо).

  1. Экспортируем следующие таблицы: SPRT — SPRT.DBF, PRICEDATA — PRICEDAT.DBF, BARCODE — BARCODE.DBF, REMAIN — REMAIN.DBF (для тех, кто использует сложные разрезы цен, думайте сами)
  2. Восстанавливаем чистую базу из шаблона или другим способом
  3. Запускаем обработку указываем ей каталог (жестко прописан, выбор не работает).
  4. После всего этого работать будет все, кроме выгрузки  в кассу.

Чтобы заработала выгрузка в кассу, нужно или заново перезаписать каждую группу, или написать обработку, которая заполнит регистр сведений «АссортиментСкладов»

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

Функция ОткрытьТаблицу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";

ВОТ ТАК И ЗАКОНЧИЛИСЬ ОЧЕРЕДНЫЕ БЕССОННЫЕ ВЫХОДНЫЕ.

Доработок не будет.

1 Comment

  1. maljaev

    Спасибо, помогло раскрутить связку tranzt-sprt-remain-pricedata при построении запроса.

    P.S. Кстати да, а чего ADODB и запросы не юзаешь-то? Зачем этот изврат с DBF?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *