Всем Ку!
1С7.70.025, DBF, 1C++ 3.01.19, FormEx 2.0.5.93
Предыстория: была поставлена задача загрузить ~19000 номенклатурных позиций из экселя в базу. При попытке решения задачи штатными методами столкнулся с проблемой непонятного стремительного роста индексного файла таблицы номенклатуры (на этапе 40% файл занимал больше 1ГБ!). При этом сама скорость загрузки экспоненциально падала. Стоит отметить что помимо самой номенклатуры загружались данные еще в 4 подчиненных справочника: единицы, цены, цены поставщиков, остатки на складах поставщиков. Саму операцию все-же удалось завершить в 3 подхода между которыми удалялись и восстанавливались индексные файлы. В итоге было затрачено около 8 часов. Попытка выяснить причины и возможные пути решения привели к мысли создания механизма записи данных напрямую с помощью средств 1С++. В результате, дабы изучить технологии ООП
![Улыбка Улыбка](https://www.1cpp.ru/forumfiles/Templates/Forum/default/smiley.gif)
был создан класс, позволяющий осуществлять эту самую операцию.
С применением созданного класса поставленная задача была решена за 12 минут! Правда остался один побочный эффект: индексы все-равно получаются покореженными и справочники ведут себя неадекватно ,) т.е. после загрузки данных необходима переиндексация.
Косяки и вопросы знатокам:Сам класс доработан только до необходимого уровня для решения поставленной задачи, но при этом содержит несколько явных косяков.
Если справочник имеет реквизит типа "Дата" и для него не передается или передается пустое значение, оно заменяется на дату 01.01.1980, поскольку драйвер матерится и не принимает ни одну из комбинаций:
гЗапрос.ДобПараметр(1,8,0,0);
гЗапрос.УстПараметр(1,Дата(0));
гЗапрос.УстПараметр(1,'00.00.00');
гЗапрос.УстПараметр(1,' . . ');
гЗапрос.УстПараметр(1,' / / ');
...
гЗапрос.ДобПараметр(1,14,10,0);
гЗапрос.УстПараметр(1,"00/00/0000");
гЗапрос.УстПараметр(1,"00-00-0000");
...
Вобщем никак у меня не получилось передать ему пустую дату ,(
Что я делаю не так? Вариант ВыполнитьSQL_ИзТЗ и прочие альтернативные конструкции не пробовал, поскольку мне удобнее использовать конструкцию:
Запрос.Подготовить(ТекстЗапроса);
Запрос.ДобПараметр(...);
Запрос.УстПараметр(...);
Запрос.ВыполнитьИнструкцию();
Ну и просто недоработки:
а) Длинная периодическая строка урезается до 23 символов на одну секцию (мне пока не надо было)
б) Если код справочника имеет строковую составляющую, то новый код скорее всего получить не удастся
в) не учитываются неопределенные ссылки, т.е. 13 символьные, только полностью типизированные объекты С9
Прошу конструктивной критики в плане оптимизации структуры класса и, если есть, другие замечания и пожелания
Спасибо за внимание!