Форма справочника номенклатуры из 1С
Продолжая 1Совскую тему, недавно поднятую на блоге, попробую поматериться на тему Номенклатуры. Поматериться потому что во многих конторах отношение к этой, в общем-то основополагающей части любой базы данных совершенно наплевательское.
Применительно к 1С Номенклатура — это одноимённый справочник конфигурации, который чаще всего хранит список (номенклатуру) товаров или услуг, с которыми работает предприятие. Ну а для «внешних» людей — это банально прайс-лист этого предприятия. Я даже не знаю как объяснить, потому что для меня аккуратное обращение с данными — это аксиома, что вот этот самый спиок товаров должен иметь понятный простому человеку и аккуратный вид.
Основная проблема, которую я встречал чаще всего — это отсутствие единого стиля наименования позиций, даже находящихся в одной и той же группе. Ну например тот же ПРЕСТИЖ страдает чем-то вроде следующего. Есть группа «Автоматы\ABB\S201». И дальше там валяются вперемешку такие позиции как: «Авт.выкл.однопол C16», «Автомат.выкл три полюса С 32», а другой номинал уже без пробела после буквы «С»: «С25». База пытается сортировать это по алфавиту и вместо интуитивно понятного [новым менеджерам] листания по возрастанию количества полюсов и номинала начинается каша. Вроде бы после 25А должно идти 32, а «С 32» стоит с пробелом и база сортирует как «С» 32, «С10», «С16″…
Следующая проблема вытекает из первой — так как товар часто невозможно найти по его наименованию (потому что хрен знает как его обозвали), то народ создаёт этот товар ещё раз под другим названием. А ещё бывает как на моей фабрике — не найдут нужный полуфабрикат в группе, и создают его вообще в другой группе. Но с тем же именем. И тогда базу плющит: это ж для неё два разных товара (и плевать что они называются одинаково) — вот одного на складе 10 000 штук, а другого — 100. И что куда расходовать — непонятно. А если это движение было сделано двумя годами назад — то это пиздец. Надо поднимать все бумаги, откатывать базу и разбираться.
Поэтому, вообще-то, наименование номенклатуры (и её артикул) должны соответствовать определёнными правилам. Ну например сначала пишем Тип сущности («Что это?»), потом идёт уточнение типа («Для чего?», «Что делает?») далее основная характеристика («Сколько?», «Какое?») и потом дополнительные уточнения, если они нужны. Ну например, пример обозначения того же автомата может выглядеть так: «ABB S201 Автоматический выключатель 1-полюсный C16А 6kA». И так далее.
Моя же база номенклатуры изначально разрабатывалась как универсальный каталог, в котором можно быстро найти сведения о товаре. Я-то ни чем не торгую, максимум — составляю списки на покупку материалов и веду их учёт по складам. Началось это с создания простой формы справочника, а кончилось довольно мощной (и тормозной) штукой. Щас покажу!
У моей номенклатуры можно задать обычные основные свойства типа 1С-овского наименования, производителя и всяких штрих-кодов. До кучи у меня (как и в других базах) есть полное наименование. Его появление связано с тем, что штатно 1Ска 7.7 может сделать любой строковой реквизит длиной до 999 знаков, но наименование справочника — только до 100. Не знаю, поправили ли в 8-й версии это ограничение. Артикул и модель используются для быстрого поиска товара по ним. Кстати, это хороший стиль — выделять артикул товара в отдельную колонку формы справочника, чтобы использовать встроенный в 1С поиск по первым буквам. Конкретно мне больше всего нравится прайс АБН, где любое обозначение начинается с наименования производителя и артикула.
Основная страница свойств номенклатуры
Но это всё — цветочки. Это есть в любой базе, даже самой детской. Дальше начинаются интересности. С первой интересностью я столкнулся опять же в своём ПРЕСТИЖе, когда там сменилась парочка менеджеров, а мне дико срочно надо было у них купить кабелей. Ну так я ж умный — я пришёл со своей красивой распечаткой из своей базы со своими красивыми названиями типа «Провод монтажный ПВ-3 (гибкий) 6 кв.мм, Жёлто-Зелёный». А у народа глаза разбежались — пока они переводили это в свои несчастные «ПВ3 6 Ж-Зеленый». Посмотрел я на это и родил мега-фишку: наличие своего наименования для каждого поставщика. Вот посмотрите скрин ниже (цены старые, если что).
Список поставщиков номенклатуры и их цен
Тут у нашего автомата аж три поставщика, и для каждого есть своё название позиции, свой артикул и штрих-код, если надо. Ну и для справки — их цены. Соответственно, когда мы обращаемся к этому поставщику и даём ему заказ, то список заказа формируется именно в его кривых кракозябрах, с его личными артикулами и прочими фишками. Ниже по тексту я покажу как это выглядит. Можно сделать (но я не сделал — лень) обработку, которая действует наоборот: считывает XLS-прайсик поставщика, и по его кодам-наименованиям находит наш товар в базе и всасывает обновление цен. При этом, конечно же, наш товар как у нас в базе звался, так и зовётся.
Далее — у меня идёт стандартная вкладка, где выводятся мои цены для этого товара (часть считается автоматически) и единицы измерения. Тут рассказывать нечего — это всё стандартно. Несколько единиц измерения, в документах можно выбирать любую и ставить количества в ней. Ну например можно купить 300 метров кабеля, а можно — три бухты по 100 метров. До кучи там же есть поле Минимального остатка. Здесь всё тупее некуда. Когда проводится документ списания, база смотрит сколько товара осталось на складе (или на всех) и, если меньше минимума — выкидывает предупреждение. А то я люблю забывать купить всякую мелкую фигню. Вот на ограничители на DIN-рейку тоже поставлен остаток в 10 штук :) Если что — на один щиток хватит, а там можно и подкупить.
Наши цены и единицы измерения номенклатуры
А теперь представляю вам уже ягодки. Первые ягодки — это свойства номенклатуры. Опять же, в штатной ТиС такие штуки реализованы, но я пошёл немного вкривь и вкось, так как затачивался на более каталог чем функционал. У меня каждой номенклатуре может быть назначено неограниченное число свойств, которые могут использоваться в коде 1Са (через функции типа ПолучитьЗначениеСвойства()) для генерации всяких отчётов или чего-нибудь ещё. Например у меня есть свойство «(Причина списания)», значение которого автоматически подставляется как в отчёт наличия ТМЦ на складе, так и в документ СписаниеТМЦ в качестве комментария к строке и позволяет быстренько придумать (или вспомнить) на что был израсходован данный товар. А ещё свойства могут просто служить описательными характеристиками (карточкой) товара.
Страница свойств номенклатуры
Список свойств у меня растёт. Там появляются как и обычные характеристики типа Массы, так и специфические типа Количества модулей на DIN-рейке для автоматов или величины U для 19″ девайсов.
Список названий свойств номенклатуры
Вот я тут говорил про документ плана щитка (Проектирование начинки электрического щитка (примочка к 1С)) и что там же можно выбрать конкретную номенклатуру конкретной позиции этого щитка. И вот если у неё есть указанное свойство количества модулей на DIN-рейке, то это число модулей сразу же и подставляется в щиток без лишней работы. У меня вообще в планах написать параметрический поиск. Он сюда уже жутко просится. Скажем «А отбери-ка мне кабеля чёрного, с сечением не менее 10 и не более 12 квадратов, чтобы был цельный медный и ещё было больше 20 метров на складе в наличии».
Идём далее. Картинки! Ну — картинки прицепить к номенклатуре — это тоже святое. Когда-то я думал сделать это для своей фабрики, чтобы идиоты менеджеры видели ЧТО они вообще продают и что стол и стол-бутылочница — это разные вещи, хоть называются похоже. Но я пошёл ещё дальше!
Присоединённые картинки номенклатуры
Мне подумалось, что кроме картинок (или одной картинки товара) можно цеплять ещё и всякие документы, чертежи… итого получилось следующее:
Страница вложений номенклатуры
Конкретно у меня возможность подключения любого аттача есть к трём объектам: Контрагенты (карты проезда и т.д.), Номенклатура (фото товаров, документация, справочные листки, инструкции) и любой Документ. Ну например к документу План сметы офигенно удобно приложить чертёж помещения, по которому эта смета и составлялась. В базе всё будет под рукой, никуда не денется, и через год-другой вспомнить «Ашо там было и ваще это хто?!» будет очень легко.
До кучи на свойствах построена мега-фишка: автоматическая генерация наименования номенклатуры. Я вот выше говорил, что по идее наименование номенклатуры должно подчиняться какому-то закону. Так вот что у меня сделано для этого. Есть некий набор служебных свойств, которые обозначают Тип, ПодТип, Модицикатор и прочую фигню (они начинаются со знака «$»). И есть некий набор служебных (опять же) Шаблонов. Причём шаблоны заданы как для чисел, так и для форматирования элементов справочника. Вот смотрите на картинку ниже:
Шаблоны наименований номенклатуры в справочнике
Собственно в 1С были встроенные в конфигурацию функции типа ФорматДаты, ФорматСумм — но у меня всё чуть гибче: шаблон находится в справочнике, и для того, чтобы его изменить, не надо лезть в код конфигурации. Итак, мы задали служебные свойства (см. картинку со свойствами) и указали там же какой из шаблонов форматирования названия использовать. Шаблонов названий может быть несколько потому что для автоматов нужны одни параметры, для кабелей — другие и так далее. На рисунке выше я беру часть служебных свойств и добавляю пару реквизитов в квадратных скобках. Подставлять можно что угодно и как угодно. Наименования для печати и отображения могут различаться.
Пример использования наименований номенклатуры для заказа поставщикам
Демонстрирую работу своей фишки с несколькими наименованиями. Положим мы хотим заказать какой-нибудь фигни в ПРЕСТИЖе. Создаём документик:
Заказ номенклатуры первому поставщику
Всякие галочки позволяют быстренько запомнить какой-нибудь номер резерва (если заказал по телефону) «Входящий документ», и сразу же взять денег (оплатить, предоплата) или, если поснимать все галки, составить из документа просто список товаров без конкретных движений в базе. Итак, смотрим на реальные мои наименования товаров и печатаем заказ:
Распечатка заказа для первого поставщика
Видим как наш «Кабель силовой (инсталляционный) …» стал «Кабель NYM», и как проставились всякие артикулы и прочая хрень для заказа в Престиж’е. Тётки теперь со своей же бумажки всё вкурят без каких-то дополнительных пояснений.
Отлично. А теперь поменяем поставщика на АБН:
Тот же самый заказ номенклатуры второму поставщику
И снова напечатаем. Опа! Теперь короткий ШТЛП превратился в длиную строчку, да и автоматам досталось :)
Распечатка заказа для второго поставщика
Вот так оно и работает. А если движения по документу были сделаны, то вся инфа о заказе идёт в отчёт «Состояние заказов», который особой инфы не несёт, но мозолит глаза списком «чё купить» и тоже активно используется: например кончились у меня F-разъёмы (минимальный остаток предупредил), я сразу не думая вбил заказ на 100 штук. А потом все эти заказы сортируются по Договорам с клиентами и по Поставщикам. То-есть можно распечатывать (в режиме, когда подставятся наименования поставщиков) и нести в магазины.
Список заказанных позиций хранится в базе
Вот такая у меня база. Сейчас номенклатура потихоньку заполняется и переокучивается под мои нужды, а сами ссылки на номенклатуру используются по всей-всей базе. В списке сетей (я таки доделал обещанную привязку трасс и кабелей сетей прям к конкретной номенклатуре), в списке щитков и ещё чёрти-где! Так что любите и берегите свою номенклатуру. Проряжайте, упорядочивайте её так, чтобы сторонний (или новый) человек легко мог в ней разобраться!
Проекту исполнилось 16 лет! Поддержать проект материально, проспонсировать проекты Автора или сделать ему подарок можно на этой странице: "Донаты и Спонсорство, Список Желаний".
вот если б в добавок к своим изысканиям в одинэсе подтянул в функционал лайтик сметы ( http://www.kors-soft.ru/opsme2.htm ), цены бы тебе не было :)
Ха! А это чем тебе не функционал смет? Что ещё надо? Я ж говорю: номенклатура — это святое! Загони в номенклатуру список услуг (прайс) и товаров — и выписывай вот так два документа: смету и заказ ТМЦ.
И статус заказов из этой же 1Ски мне же на блог грузятся ещё :)
УПС! Я скриншот забыл показать! Вот это: https://cs-cs.net/fileTrash/picTemp/Smeto.gif
в лайтике имеет место быть одна весьма любопытная задумка — автосмета, увы к электромонтажу она мало применима, для электричества, опять же, если ставить главным движителем лень, реализовать бы что-то типа этого:
http://www.masterwire.ru/images/scheme_one.png
зелепеньким отмечены кнопочки, ну или например чекбоксы, не суть, которые достаточно нажать и получить некий средний результат стремящийся к уже готовой смете и ведомости потребности материалов.
всё таки объекты, а следовательно и решения, очень похожи друг на друга и можно было бы побыстрому сделать рассчеты предстоящих клиенту трат, опираясь на простые и совсем незатейливые формулы: если дом говно возможен только один разумный вариант — это проводка без изысков, тссказать -эконом.
вот и рассчитываем: кол-во комнат на 4 розетки (по углам) в каждой комнате, плюс санузел, плюс по двухклавишному выключателю на все вместе и по патрону с лампочкой в каждую комнату.
тут и провода посчитать нетрудно (приблизительно конечно) и подрозетники учесть и крепеж и те же ограничители на динрейку.. в общем много чего.
а поскольку это эконом то и электроустановку предложить соответствующего ценового сегмента, например каптику.
Бвахаха!! Над форумлой поржал! Ща покажу свою считалку!
https://cs-cs.net/fileTrash/picTemp/PriceCalc.gif
Надо будет сделать не такой матерный вариант, а то все клиенты разбегутся :)
У меня всё вылезло в коэффициенты и цены с потолка. Скажем, потолок натяжной — значит возиться меньше — снижаем сложность работ по точкам для светильников.
А стены надо штробить для опусков с того же потолка? Значит чуть повысим.
В щитке линий мало? Значит снизим. Надо перебирать этажный щиток — чуть поднимем по нему сложность работ.
Надо сделать срочно и прям завтра (и вообще — разорвись, но сделай) — значит общую сложность чуть подымем. Вот так оно и считается.
Я ведь писал о своей политике подсчёта. Сметы я давно не рисую, если только напоказ или конторам каким-нибудь. А с таким калькулятором быстрее. «Шлите мне план на мыло — щас посчитаю» и через 20 минут ответ.
Ещё в 1С в других конфигурациях есть такая тема как «Нормы расхода». Отсюда можно потырить следующую идею. К позиции услуг сметы (скажем, «Штробление бетона, за 1 пог.метр») добавляются ссылки на ту же номенклатуру с указанием количества, необходимого на 1 метр этой штробы. Ну скажем ссылки на алебастр, ссылки на диск для штробореза (что на 1 м его уходит 0,002 штуки и после 50 метров нужен новый диск) и т.д.
И когда ты в смете пишешь «Штробление 150 метров», тебе сразу вываливает примерный список расходников или материалов. Скажем, три комплекта дисков и 4 мешка ротбанда.
А так как у меня есть те самые свойства, то можно на них сваять парсинг формул. Ну типа Ротбанд = 0,024 мешка * [Ширина штробы] * [Глубина штробы].
Мне лень этим морочиться, и я не буду :) Мне хватает такой считалки. Но так возможности программирования безграничны. Последнее что я сделал у себя — тупо сменил единицы измерений у некоторых позиций сметы. Ну если раньше у меня было штук 70 позиций вида «Установка щитка для автоматов на [2, 4, 6, 8, …48, 56] модулей в [бетонные, кирпичные, гипсовые] стены», то теперь стало «Установка щитка для автоматов в твёрдые стены, за DIN-модуль» — и в итоге я пишу размер щитка, а не пложу сущности :)
я признаться подумываю над реализацией такой штуки в качестве сервиса прикрученного к блогу, жаль только что мои познания в пхп несопоставимы с успешным решением задачи.
А там может JavaScript быстрее? Только тогда код спереть могут быстрее.
А подумывай — будет прикольно!
я надеюсь, что не только прикольно, но и полезно, а уж какой в этом потенциаль для мракетологов и пиарастов от производителей… осталось взять и сделать :)))
Круто! Научишь меня? На чистоту — расскажи алгоритм сие программы. От сздания таблиц и их програмирования. Если можно в личку. Какой первый шаг должен быть и как нужно это всё соединить в одну общую мысль? Гы :( ПОЖАЛУЙСТА,,,если чё помогу чем ,,
Эээыээ… это щас выглядит примерно как «какие рычаги надо жать на машине, чтобы выиграть формулу 1». Тут так и сразу не прокатит. Тебе придётся потихоньку подбираться.
Вот тут есть всякое старое гавно, но для понятия принципа хватит: http://mista.ru/tutor_1c/index.htm
Ещё можно запереться сюда: http://forum.sources.ru/index.php?s=a271e834ec46be7c1433d663f70d77f5&showforum=34 , там есть и я evGenius, который в 1С шпарит даже лучше меня.
То-есть, кое-что придётся рыть и изучать самому — тут как в нашей электрике не получится прям сразу сесть и написать.
У меня тут сделано очень просто. Для всяких вложений и свойств, поставщиков использованы подчинённые к Номенклатуре справочники. Все эти кнопочки «добавить/удалить/изменить» написаны программно, а в качестве таблицы прям таблица и использована (она в 1С есть как компонент). Туда программно добавляются колонки и при открытии формы из справочников считывается список свойств и прочего. Ну, скажем, вложения грузятся так:
Процедура ОбновитьВложения()
//Объект справочника, откуда читаем вложения
СпрВл = СоздатьОбъект(«Справочник.ВложенияНоменклатуры»);
СпрВл.ИспользоватьВладельца(ТекущийЭлемент());
//Запоминаем выбранную строку, чтобы не сбрасывать её
ТекСтрока = ТабВложений.ТекущаяСтрока();
ТабВложений.УдалитьСтроки();
//Очистить картинку текущую
СписКартинок.УдалитьВсе();
ПустоБля = СоздатьОбъект(«Картинка»);
Картинка.УстановитьКартинку(ПустоБля);
//Ищем в справочнике подряд ВСЁ, кроме картинок (картинки будут отдельно)
Если (СпрВл.ВыбратьЭлементы() = 1) Тогда
Пока (СпрВл.ПолучитьЭлемент() = 1) Цикл
//Добавим в таблицу…
ТабВложений.НоваяСтрока();
ТабВложений.Объект = СпрВл.ТекущийЭлемент();
ТабВложений.Наименование = ТабВложений.Объект.Наименование;
Если (СпрВл.Тип = Перечисление.ТипВложения.Документ) Тогда
ТабВложений.Тип = «Док»;
ИначеЕсли (СпрВл.Тип = Перечисление.ТипВложения.Картинка) Тогда
ТабВложений.Тип = «Кар»;
ИначеЕсли (СпрВл.Тип = Перечисление.ТипВложения.Программа) Тогда
ТабВложений.Тип = «Прг»;
ИначеЕсли (СпрВл.Тип = Перечисление.ТипВложения.Архив) Тогда
ТабВложений.Тип = «Арх»;
Иначе
ТабВложений.Тип = «?»;
КонецЕсли;
ТабВложений.Файл = СокрЛП(СпрВл.ИсходноеИмяФайла) + » (» + глФорматРазмера(СпрВл.РазмерФайла) + «)»;
Если (СпрВл.Тип = Перечисление.ТипВложения.Картинка) Тогда //Добавим картинку в список картинок для быстрого просмотра
СписКартинок.ДобавитьЗначение(ТабВложений.Объект, ТабВложений.Объект.Наименование);
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Сортируем по наименованию
ТабВложений.Сортировать(«Объект+»);
ТабВложений.ТекущаяСтрока(ТекСтрока);
СписКартинок.Сортировать();
ПриВыбореКартинки();
КонецПроцедуры
Вот… так что спрашивай )) Или начинай с малого. Ты ж вроде по мылу спрашивал) И учти что эта конфа у меня писалась с 2008 года… это так, для справки :)
Спасибо! Постараюсь обуздать.
Давай жги! Только не как тот программер, который свою рисовалку щитка написал!) А вдумчиво и аккуратно :) Буду следить за тем, как у тебя дела идут!
Добил важный патч к базе. В смысле я таки готовлюсь к написанию МЕГА-хрени автоматической вгрузки прайса в свою базу и обновлению цен.
Проблема тут вот в чём. Например в АБН указана цена за единицу товара (метр кабеля, штуку крепления и прочего). А вот в REXANT и PREMIER, которые торгуют стяжками, дешёвыми кабелями, цена указана за УПАКОВКУ товара. Ну то-есть, у нормальных людей кабель в прайсах идёт за 1 метр, а у них за катушку в 100 метров, потому что они катушками и торгуют, и им так удобнее.
Офигенно. А что мне делать с моими ценами поставщиков, если я хочу привести их к виду цен за метр? Ну я могу пересчитать вручную: цену за катушку поделить на 100 (метров).
Ну а дальше? Моя обработка загрузит прайс, снова считает цены за… катушку — и пиздец? И будет 1 метр кабеля вместо 18.70 стоить 1870. Гы гы))
Вот я подумал и ввёл новую галочку у Цены Поставщика: «Это цена за упаковку». У нас всё равно единица упаковки задана на вкладке Единиц и Цен, так вот если галка стоит, то внутренняя функция «ПолучитьЦенуНоменклатуры()» автоматически всё делит и разбирается что и где и как :)
А в итоге на обработку загрузки цен ляжет задача тупо найти товар по наименованию поставщика и тупо обновить его цену. Всё просто :)