понедельник, 16 марта 2015 г.

Очистка периодических реквизитов на основе прямых запросов 1с 7.7



Привествую тебя о велики путешественник! Ты еще грядешь по пустыне 1с 7.7 как и я...
Погуглив я нашел решения своей проблемы для очистки справочника товара с периодическим реквизитом ЦенаР, но о ГОРЕ! Она работала супер по алгоритмик но ничего не давала на выходе так как немогла удалить реквизиты которые были установлены документами для решения этой проблемы пришлось обратиться к любимому костылю, палочке выручалочке 1с ++ http://www.script-coding.com/1cpp.html результат моих мучений и последующей радости привожу ниже.

//========================================
Процедура ВыполнитьУдалПериодЗнач(текЭлем ,метаРеквизит, тбУдалЗначение, ИтогСчетчик, Recordset, rsDelConst, MetaDataWork)  
текст="
|SELECT Row_ID НомерЗаписи,
|Date ДатаЗнач
|FROM _1sconst (nolock)
|WHERE (objid=:ТекЭлем) AND (id=:ИДОб) AND (Date < :выбДате) ORDER BY Date DESC";
Recordset.УстановитьТекстовыйПараметр("ТекЭлем",текЭлем);
Recordset.УстановитьТекстовыйПараметр("ИДОб",MetaDataWork.ИДОбъекта(метаРеквизит));
Recordset.УстановитьТекстовыйПараметр("выбДате",ткДатаОчистки);
тбПериодЗнач = Recordset.ВыполнитьИнструкцию(текст);
    // оставляем только одно значение периодического реквизита до даты свертки
    // остальные удаляем
тбУдалЗначение.УдалитьСтроки();
тбПериодЗнач.ВыбратьСтроки();
Пока тбПериодЗнач.ПолучитьСтроку() > 0 Цикл
тбУдалЗначение.НоваяСтрока();
тбУдалЗначение.НомерЗаписи = тбПериодЗнач.НомерЗаписи;
тбУдалЗначение.ДатаЗнач = тбПериодЗнач.ДатаЗнач;
КонецЦикла;
    СчетчикЗначений = 0;
тбУдалЗначение.ВыбратьСтроки();
Пока тбУдалЗначение.ПолучитьСтроку() > 0 Цикл
        Если СчетчикЗначений > 0 Тогда
rsDelConst.УстПараметр(1, тбУдалЗначение.НомерЗаписи);
rsDelConst.ВыполнитьСкалярный();
ИтогСчетчик = ИтогСчетчик + 1;
        КонецЕсли;
        СчетчикЗначений = СчетчикЗначений + 1;
КонецЦикла;      
КонецПроцедуры
 


//========================================
Процедура УдалитьИсториюПоРеквизиту()  
ИтогСчетчик = 0;                  

    MetaDataWork = СоздатьОбъект("MetaDataWork");
    Recordset    = СоздатьОбъект("ODBCRecordSet");
rsDelConst   = СоздатьОбъект("ODBCRecordSet");
ткЗапросУдалитьКонст = "DELETE FROM _1sconst WHERE _1sconst.Row_ID = ?";
rsDelConst.Подготовить(ткЗапросУдалитьКонст);
rsDelConst.ПостроитьПараметры();

тбУдалЗначение = СоздатьОбъект("ТаблицаЗначений");
тбУдалЗначение.НоваяКолонка("НомерЗаписи", "Число",10,0);
тбУдалЗначение.НоваяКолонка("ДатаЗнач", "Дата");
Сообщить(Строка(ТекущееВремя())+" Удаляем значения периодических реквизитов в справочниках до даты свертки");      
    Периодический = СоздатьОбъект("Периодический");
    Для т = 1 По Метаданные.Справочник() Цикл
        Состояние("Удаление значений периодических реквизитов справочника " + Метаданные.Справочник(т).Идентификатор);
        // Список периодических реквизитов
        ПериодическиеРеквизиты = СоздатьОбъект("СписокЗначений");
        Для п = 1 По Метаданные.Справочник(т).Реквизит() Цикл
            Если Метаданные.Справочник(т).Реквизит(п).Периодический = 1 Тогда
                // Есть периодический реквизит
  сообщить(Метаданные.Справочник(т).Реквизит(п).Идентификатор);
                ПериодическиеРеквизиты.ДобавитьЗначение(Метаданные.Справочник(т).Реквизит(п));
            КонецЕсли;
        КонецЦикла;
        Если ПериодическиеРеквизиты.РазмерСписка() > 0 Тогда
            Сообщить("Удаление значений периодических реквизитов справочника "+Метаданные.Справочник(т).Идентификатор);
            Справ = СоздатьОбъект("Справочник."+Метаданные.Справочник(т).Идентификатор);
            Если Метаданные.Справочник(т).Владелец.Выбран() = 1 Тогда
                // подчиненный справочник (необходимо сначала выбрать владельца)
                Владельцы = СоздатьОбъект("Справочник." + Метаданные.Справочник(т).Владелец.Идентификатор);
                Владельцы.ВыбратьЭлементы();
                Пока Владельцы.ПолучитьЭлемент() = 1 Цикл
                    Справ.ИспользоватьВладельца(Владельцы.ТекущийЭлемент());
                    Справ.ВыбратьЭлементы();
                    Пока Справ.ПолучитьЭлемент() = 1 Цикл
                        Для СчетчикЦикла = 1 По ПериодическиеРеквизиты.РазмерСписка() Цикл
                            ИдРекв = ПериодическиеРеквизиты.ПолучитьЗначение(СчетчикЦикла);
ВыполнитьУдалПериодЗнач(Справ.ТекущийЭлемент(), ИдРекв, тбУдалЗначение, ИтогСчетчик, Recordset, rsDelConst, MetaDataWork);  
                        КонецЦикла;
                    КонецЦикла;
                КонецЦикла;
            Иначе
                // обычный справочник
                Справ.ВыбратьЭлементы();
                Пока Справ.ПолучитьЭлемент() = 1 Цикл
                    Для СчетчикЦикла = 1 По ПериодическиеРеквизиты.РазмерСписка() Цикл
                        ИдРекв = ПериодическиеРеквизиты.ПолучитьЗначение(СчетчикЦикла);
ВыполнитьУдалПериодЗнач(Справ.ТекущийЭлемент(), ИдРекв, тбУдалЗначение, ИтогСчетчик, Recordset, rsDelConst,MetaDataWork );  
                    КонецЦикла;
                КонецЦикла;
            КонецЕсли;
КонецЕсли;    

КонецЦикла;  
rsDelConst.Закрыть();
Recordset.Закрыть();
сообщить("Итого удалил " + ИтогСчетчик);
КонецПроцедуры            

Учет планограмм и выкладки товара


В магазине постоянно возникает вопрос
  • Куда положить ЭТОТ товар?
  • Сколько прибыли и выторга приносит Воон та полка и стеллаж.
  • Как быстро внести данные если выкладка закреплена в зале и нужно сидеть и вноить данные не эффективно?
Для решения подобных задач решил создать программу которая быстро и эффективно и недорого закрывала бы подобные вопросы.
Итак приступим.

1. Вносим товар с фотографиями в базу данных
2. Вносим данные по стелажам и полкам в магазине 
3. Специальной программой просто сканируем товар по штрих коду или вносим его по коду в порядке очередности на полке тем самым обеспечивая быструю привязку ланограммы по факту
4 загружаем в программу данные продаж за период когда данную планограмму можно считать устоявшейся
5 Анализируем в любом разрезе полочное пространство 
  • Какая полка  стеллаж сколько приносит прибыли
  • Количество товара на полке
  • Самый неэффективный товар
  • Самый эффективные товар и его расположение
6 Изменяем планограмму в программе и печатаем для персонала что и как должно стоять

7 Можем переместить низкоэффективное полочное пространство и в будущем проанализировать его еще раз что бы добиться максимальной прибыли от площади магазина