Версия для печати темы (https://pro1c.org.ua/index.php?s=4ed80009c1df7e05238fc977c3ff3cbd&showtopic=55535)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Составной ключ в справочнике

Автор: bizisoft 03.12.19, 15:18

Здравствуйте.
1С:Предприятие 8.2 (8.2.19.130)
Альфа-Авто: А+А, украинская версия 4.1.19.01

Подскажите пожалуйста, возможно-ли перестроить первичный ключ справочника (Например Номенклатура).
Могу ошибиться в формулировках, поэтому попробую описать чего нужно добиться.

Имеется оригинальный товар с определенным артикулом например 26300-35505 производитель у оригинала допустим MOBIS
Также есть другой аналог от другого производителя (MANDO) со своим артикулом MOF4459.
Но при появлении аналога, не имеющего своего артикула приводит к тому, что в справочник нельзя добавить два одинаковых артикула из-за их неуникальности, т.к. Альфа проверяет уникальность товара по Артикулу.
Т.е. полу Производитель не несет никакой задачи, контролирующей уникальность, кроме как чисто информационную.

Можно-ли сделать составной ключ по двум полям Артикул+Производитель и выполнять проверку уникальности через такую связку, или сама Платформа/Конфигурация не позволяет такое делать?

Спрашивал у Рарус, они сказали, что контроль уникальности по Артикулу можно отключить, а по составному ключу (Артикул+Производитель) такого в Альфе нет и нет даже в планах. Больше технической информации у них получить мне не удалось, т.к. поддержка такую консультацию не оказывает.

Благодарю.




Автор: Vofka 03.12.19, 15:23

То о чем вы говорите - это не первичный ключ справочника. Это бизнес логика конкретной конфигурации. Поменять это можно. Найти в коде где происходит проверка и описать свою логику.

Автор: bizisoft 03.12.19, 16:38

Vofka @ Сегодня, 16:23 * ,
Я правильно понимаю, что это должно быть где-то в модулях справочника Номенклатура или это может находится в любом месте конфигурации, включая и закрытые модули?


Автор: Petre 03.12.19, 16:45

В ПолучитьОбязательныеРеквизиты отключаете уникальность. В ПередЗаписью пишете свой блек-джек.

Автор: Макс1С 03.12.19, 17:03

Подумайте над тем, чтобы просто отключить уникальность по артикулу. Вдруг будет ситуация когда у одного производителя будут абсолютно разные запчасти без артикулов - ключ Производитель+Артикул также окажется неуникальным

Автор: bizisoft 04.12.19, 11:57

Макс1С @ Вчера, 18:03 * ,
Спросил у Рарус, как отключить контроль уникальности и вот что они ответили:

Цитата
В случае снятия контроля номера по каталогу, уникальность записей в справочнике контролироваться никак не будет. Можно завести множество идентичных записей номенклатуры.
Снятие права "Проверка заполнения справочников и документов" позволит добавлять в документе одинаковые строки.
Но оно также приведет к полному отключению контроля корректности заполнения базы данных. Отмену использования данного права мы не рекомендуем, т.к. результат может быть непредсказуемым, каким-угодно. Так сказать на ваш страх и риск.



Я попробовал отключить это правило и понял, что оно влияет не только на справочник Номенклатура, но и на все справочники абсолютно.
Также это рушит всю бизнес-логику программы.

Автор: bizisoft 04.12.19, 13:09

Цитата(Petre @ 03.12.19, 17:45) *
В ПолучитьОбязательныеРеквизиты отключаете уникальность. В ПередЗаписью пишете свой блек-джек.

Я нашел такие строки
Это видимо для проверки уникальности по Артикулу?
 //
        Если обПраво("НомерПоКаталогуУникальный",Права) Тогда
        ОбязательныеРеквизиты.Вставить("Артикул",3);               // Это нужно закомментировать ?
    КонецЕсли;


А это проверка уникальности строк в ТЧ документа, чтобы можно было добавлять несколько одинаковых строк но например с разной ценой?
        
    // Проверка на уникальность строк в табличной части "Состав набора".
    Если (ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Комплект) ИЛИ (ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Набор) Тогда
        ОбязательныеТовары = Новый Структура();
        ОбязательныеТовары.Вставить("Номенклатура", 3);                                // Это нужно закомментировать ?
        ОбязательныеТовары.Вставить("ХарактеристикаНоменклатуры", 2);
        ОбязательныеРеквизиты.Вставить("СоставНабора", ОбязательныеТовары);        
    КонецЕсли;


Я правильно понимаю, что если закоменнтировать эти строки, то отключится проверка по Артикулу в справочнике Номенклатура, а остальные правила проверки в других справочникат не будут отключены?

Автор: Petre 04.12.19, 13:52

bizisoft @ Today, 13:09 * ,
Закоментировать необходимо только первый фрагмент.

Автор: bizisoft 04.12.19, 14:46

Petre @ Сегодня, 14:52 * ,

Я уже не удержался так и поступил.
А ПерезЗаписью добавил:

//--- перед записью нового элемента
    Если (НЕ ЭтоГруппа) И (ЭтоНовый()) Тогда
        ТекАртикул = Артикул;
        ТекПроизводитель = Производитель;
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    Номенклатура.Ссылка,
            |    Номенклатура.Артикул,
            |    Номенклатура.Наименование,
            |    Номенклатура.Производитель
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    Номенклатура.Артикул = &Артикул
            |    И Номенклатура.Производитель = &Производитель";

        Запрос.УстановитьПараметр("Артикул", ТекАртикул);
        Запрос.УстановитьПараметр("Производитель", ТекПроизводитель);
        Результат = Запрос.Выполнить();
        ТЗПоиск = Результат.Выгрузить();
        Если ТЗПоиск.Количество() > 0 Тогда
            Предупреждение("Товар: "+Строка(ТекАртикул)+" ( "+Строка(ТекПроизводитель)+" ) уже существует");
            Отказ = Истина;
                КонецЕсли;
    КонецЕсли;


А чуть ниже добавил еще такую проверку так сказать от дураков - если кто-то решит в существующей записи изменить допустим производителя, тем самым получив дубль
//--- перед записью после при редактировании имеющейся записи
    Если (НЕ ЭтоГруппа) Тогда
        ТекАртикул = Артикул;
        ТекПроизводитель = Производитель;
        ТекКод = Код;
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    Номенклатура.Ссылка,
            |    Номенклатура.Артикул КАК Артикул,
            |    Номенклатура.Наименование КАК Наименование,
            |    Номенклатура.Производитель КАК Производитель,
            |    Номенклатура.Код КАК Код
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    Номенклатура.Артикул = &Артикул
            |    И Номенклатура.Производитель = &Производитель
            |    И Номенклатура.Код <> &Код";

        Запрос.УстановитьПараметр("Артикул", ТекАртикул);
        Запрос.УстановитьПараметр("Производитель", ТекПроизводитель);
        Запрос.УстановитьПараметр("Код", ТекКод);

        Результат = Запрос.Выполнить();
        ТЗПоиск = Результат.Выгрузить();
        Если ТЗПоиск.Количество() > 0 Тогда            
            Предупреждение("Недопустимая операция для: "+Строка(ТекАртикул)+" ( "+Строка(ТекПроизводитель)+" ) [ "+Строка(ТекКод)+" ] уже существует."+Символы.ПС+"Вероятно был изменен Артикул или Производитель");
            Отказ = Истина;
               КонецЕсли;
    КонецЕсли;


Отключить ограничение по добавлению в ТЧ документа нескольких одинаковых строк (Артикулов), но с разными ценами выполняется также в модуле документа или здесь подход другой?

Автор: Макс1С 04.12.19, 15:42

bizisoft @ Сегодня, 14:46 * ,
в целях оптимизации можете оставить только второй запрос-проверку, он будет покрывать и первый случай. единственное - я бы изменил условие на ссылку вместо кода

|    И Номенклатура.Ссылка <> &Ссылка";

        Запрос.УстановитьПараметр("Артикул", ТекАртикул);
        Запрос.УстановитьПараметр("Производитель", ТекПроизводитель);
        Запрос.УстановитьПараметр("Ссылка", Ссылка);


По ограничению в ТЧ: точно не помню, но в АА есть и ТЧ Товары и ТЧ Наборы, судя по комментарию в стандартном коде - это проверка для ТЧ Наборы, нужно поискать в другом мместе

Автор: bizisoft 05.12.19, 9:06

Макс1С @ Вчера, 16:42 * ,
Нашел в модуле документа

Функция ПолучитьОбязательныеРеквизиты() Экспорт
    // Обязательные поля таблицы товаров
    ОбязательныеТовары=Новый Структура();
//    ОбязательныеТовары.Вставить("Номенклатура",3);    //    <<<==========
    ОбязательныеТовары.Вставить("Количество",1);
    ОбязательныеТовары.Вставить("ЕдиницаИзмерения",3);
    ОбязательныеТовары.Вставить("Коэффициент",1);
    ОбязательныеТовары.Вставить("ХарактеристикаНоменклатуры",2);
    
    // Обязательные реквизиты документа
    ОбязательныеРеквизиты=Новый Структура();
    ОбязательныеРеквизиты.Вставить("Организация",1);
    ОбязательныеРеквизиты.Вставить("ПодразделениеКомпании",1);
    ОбязательныеРеквизиты.Вставить("Автор",1);
    ОбязательныеРеквизиты.Вставить("ВалютаДокумента",1);
    ОбязательныеРеквизиты.Вставить("КурсДокумента",1);
    Если ХозОперация <> Справочники.ХозОперации.УслугиСтороннихОрганизаций Тогда
        ОбязательныеРеквизиты.Вставить("СкладКомпании",1);
    КонецЕсли;
    ОбязательныеРеквизиты.Вставить("Контрагент",1);
    ОбязательныеРеквизиты.Вставить("ТипЦен",1);
    ОбязательныеРеквизиты.Вставить("ХозОперация",1);
    ОбязательныеРеквизиты.Вставить("ДоговорВзаиморасчетов",1);
    ОбязательныеРеквизиты.Вставить("Товары",ОбязательныеТовары);
    
    Возврат ОбязательныеРеквизиты;
КонецФункции // ПолучитьОбязательныеРеквизиты()

Закомментировал строку ОбязательныеТовары.Вставить("Номенклатура",3); - но это не дало никакого результата, т.е. по аналогии с номенклатурой не прокатило.
Где еще можно покопать?

Автор: Petre 05.12.19, 9:22

bizisoft @ Today, 9:06 * ,
Какой документ? Какую преследуете цель?

Автор: bizisoft 05.12.19, 12:39

Petre @ Сегодня, 10:22 * ,

Для начала хотел обкатать это в Поступление товаров, т.к. бывает, что от поставщика в одном приходе приходит одинаковый товар (один артикул, одного производителя), но с разной ценой
Например:
54651-2Е000 Mobis 10 100.00
54651-2Е000 Mobis 20 150.00

Соответственно если есть подобный приход, то возможно может быть случай, когда на сайте клиент заказывает одинаковый товар, но с разных складов (допустим ему нужно 4 шт, а есть по 2 на разных складах), склады могут быть как Продавца, так и его поставщика.
Исходя из этого, то получается сюда подпадает и ЗаказПокупателя, РеализацияТоваров, возможно СчетНаОплату и вероятно и НалоговаяНакладная.



Вопрос модератору: В ходе решения проверки уникальности в номенклатуре, возник второстепенный вопрос, но т.к. в правилах написано Новый вопрос = Новая тема, можно-ли его задать в этой теме или все же создать по нему свою тему?

А вот собственно сам вопрос:
Т.к. получилось сделать проверку уникальности по Арт+Бренд и решить следующую аналогичную проблему с добавлением Аналогов (также не разрешало одинаковый Арт), в форме подбора номенклатуры в ТабличномПоле списка аналогов нарушилась механика (как обозвать то) "навигации", т.е. если в списке Аналогов дблКлик по строке аналога, то он должен быть найден и спозиционирован на соответствующем элементе списка номенклатуры.
Но в связи с тем, что поиск происходит через Найти(), в которой в качестве аргумента передается значение Артикул, то для товаров с одинаковым артикулом, но разными производителями, то поиск и позиционирование происходит не так как раньше, позиционирование происходит рандомно.
В метод Найти() как я понял нельзя добавить еще один аргумент, чтобы искал по Арт+Бренд.
Пробовал НайтиСтроки()

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Артикул", ВыбраннаяСтрока.Артикул);
ПараметрыОтбора.Вставить("Бренд", ВыбраннаяСтрока.Бренд);
НайденныеСтроки = АналогиОбъединеное1.НайтиСтроки(ПараметрыОтбора);
ЭлементыФормы.АналогиОбъединеное1.ТекущаяСтрока = НайденныеСтроки[0]

Это также не работает.
Может кто знает, как можно решить данную проблему.

У меня есть одна идея, но насколько она работоспособна и оптимальна пока не знаю.
Идея такая в номенклатуру добавить поле АртБренд, куда записывать значения <Номенклатура.Артикул>+<Производитель.Код> Например: 2630035505_ЦБ00123 (думал сначала Производитель.Наименование, но наименование могут изменить).
И тогда можно будет продолжить использование метода Найти(ВыбранаяСтрока.Артикул, ), только заменил в нем ВыбранаяСтрока.Артикул на ВыбранаяСтрока.АртБренд.
Если ВыбраннаяСтрока=Неопределено Тогда Возврат; КонецЕсли;
    НайденныйАналог=Справочники.Номенклатура.НайтиПоРеквизиту("АртБренд",ВыбраннаяСтрока.АртБренд); //НайтиПоРеквизиту("Артикул",ВыбраннаяСтрока.Артикул);
Если обЗначениеНеЗаполнено(НайденныйАналог) Тогда Возврат; КонецЕсли;     
    СтандартнаяОбработка=Ложь;
        // Позиционирование в списке номенклатуры
    ЭлементыФормы.Список.ТекущаяСтрока=НайденныйАналог;
    // позиционирование в списке аналогов
    ЭлементыФормы.АналогиОбъединеное1.ТекущаяСтрока = АналогиОбъединеное1.Найти(ВыбраннаяСтрока.АртБренд,"АртБренд"); //Найти(ВыбраннаяСтрока.Артикул,"Артикул")

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

Автор: Макс1С 05.12.19, 13:02

bizisoft @ Сегодня, 12:39 * ,
Как вариант добавьте реквизит в номенклатуру, например "Номер артикула", а в стандартное поле артикул записывайте программно <Номенклатура.НомерАртикула>+<Производитель.Код> при изменении этих полей на форме.
Таким образом вы получите поле с нужной вам уникальностью в стандартном реквизите и не нужно будет переписывать во всех местах поиск и т.п. При необходимости можно добавить ещё какой-то разрез без сильных доработок
И еще можно будет раскоментить уникальность артикула )

Автор: bizisoft 05.12.19, 13:55

Цитата(Макс1С @ 05.12.19, 14:02) *
Как вариант добавьте реквизит в номенклатуру, например "Номер артикула", а в стандартное поле артикул записывайте программно <Номенклатура.НомерАртикула>+<Производитель.Код> при изменении этих полей на форме.

А вот об этом я и не подумал. Интересная идея.
Вот только тогда придется переделывать другое, например (пришло первое на ум) это документы, а именно отображение вместо реквизита Артикул другой реквизит, чтобы в документах выводились нормальные значения.
Наверное все таки проще оставить Артикул как есть и добавить АртБренд.

Буду пробовать, что получится. Потом отпишусь.


Автор: bizisoft 13.12.19, 15:46

Воспользовался вариантом от Макс1С.
Добавил реквизит тАртикул длиной как у Артикул.
У реквизита Артикул увеличил длину на длину Кода поставщика.
"Пробежался" и скопировал значение Артикул в тАртикул.
Еще разок, но уже скопировал в Артикул конкатенацию строк <тАртикул>+<"_">+<Производитель.Код>, чтобы получилось 26300-35503_ЦБ012345.

При этом покрошились все прописанные Аналоги, которые пришлось восстановить, так сказать по оставшимся следам.
"Пробежался" по РегиструСведений ГруппыАналогов, брал в нем Артикул (то что осталось) и производил поиск по Номенклатуре но уже по добавленному реквизиту тАртикул,
если находило, то менял значение Артикул в регистре сведений на значение из справочника Номенклатура.Артикул, т.е. в РС было 26300-35503 менялось на 26300-35503_ЦБ012345.
Т.о. получилось восстановить все связи по Аналогам, и чтобы два раза не ходить заодно были проставлены в регистре реквизиты/измерения Производитель и Наименование для записей, которые пользователи не заполнили, то ли в спешке, то ли по :%№"№";%.

В итоге, теперь можно создавать карточки товара с одинаковым артикулом, но разным производителем.
Осталась только косметика - в ТЧ документа добавить поле тАртикул ну и в печатных формах подменить вывод на тАртикул.


//--- добавлено через 25 мин.
А вот со снятием ограничения на добавление в ТЧ документа более одной строки одинакового товара (например с разной ценой) пока не выходит.
Нашел в модуле соответствующего документа процедуру, в которой закомментировал пару строк, как по аналогии с Номенклатурой.

// Возвращает структуру обязательных / уникальных реквизитов документа
// Возвращаемая структура содержит строковые идентификаторы реквизитов или вложенные структуры для табличных частей
// Для реквизита значение структуры содержит число 1-Обязательный, 2-Уникальный, 3-Уникальный и обязательный
Функция ПолучитьОбязательныеРеквизиты() Экспорт
    // Обязательные поля таблицы товаров
    ОбязательныеТовары=Новый Структура();
    //ОбязательныеТовары.Вставить("Номенклатура",3);       <<===========  эту
      ОбязательныеТовары.Вставить("Количество",1);
    ОбязательныеТовары.Вставить("ЕдиницаИзмерения",3);
    ОбязательныеТовары.Вставить("Коэффициент",1);
    ОбязательныеТовары.Вставить("ХарактеристикаНоменклатуры",2);
    
    // Обязательные поля таблицы распределения заказов
    ОбязательныеРаспределение=Новый Структура();
//    ОбязательныеРаспределение.Вставить("Номенклатура",3);       <<===========  эту
    ОбязательныеРаспределение.Вставить("Количество",1);
    ОбязательныеРаспределение.Вставить("ЕдиницаИзмерения",3);
    ОбязательныеРаспределение.Вставить("Коэффициент",1);
    ОбязательныеРаспределение.Вставить("ХарактеристикаНоменклатуры",2);
    ОбязательныеРаспределение.Вставить("ЗаказПокупателя",3);

    // Обязательные реквизиты документа
    ОбязательныеРеквизиты=Новый Структура();
    ОбязательныеРеквизиты.Вставить("Автор",1);
    ОбязательныеРеквизиты.Вставить("Организация",1);
    ОбязательныеРеквизиты.Вставить("ПодразделениеКомпании",1);
    ОбязательныеРеквизиты.Вставить("ВалютаДокумента",1);
    ОбязательныеРеквизиты.Вставить("КурсДокумента",1);
    ОбязательныеРеквизиты.Вставить("Контрагент",1);
    ОбязательныеРеквизиты.Вставить("ТипЦен",1);
    ОбязательныеРеквизиты.Вставить("ХозОперация",1);
    ОбязательныеРеквизиты.Вставить("ДоговорВзаиморасчетов",1);
    ОбязательныеРеквизиты.Вставить("СрокПоставки",1);
    ОбязательныеРеквизиты.Вставить("Товары",ОбязательныеТовары);
    ОбязательныеРеквизиты.Вставить("РаспределениеЗаказа",ОбязательныеРаспределение);
    
    Возврат ОбязательныеРеквизиты;
КонецФункции // ПолучитьОбязательныеРеквизиты()

Но видимо, что-то еще мешает.

Может у кого-то есть идеи, где нужно копать?

Автор: Макс1С 13.12.19, 16:13

Цитата(bizisoft @ 13.12.19, 15:46) *
// Для реквизита значение структуры содержит число 1-Обязательный, 2-Уникальный, 3-Уникальный и обязательный

Можно попробовать поставить вторым параметром "1", то что Номенклатура должна быть заполнена нам подходит, но уникальной быть не должна.
Но в рабочую базу не спешите такое добавлять , крутиться у меня в памяти, что сделано это неспроста и другие механизмы рассчитаны на уникальность номенклатуры в документе... что-то с партиями..

Автор: bizisoft 13.12.19, 16:22

Кое что удалось найти.
В модуле общем модуле дкДокументы в функции дкПроверитьКорректность(.....) закомментировал строку Результат = Ложь; и вроде теперь можно добавлять две одинаковые строки в ТЧ документов, при этом я еще убрал комментирование со строк из постов выше.

// необходимо исключить проверку уникальности для сотовых платежей 
                    Если НЕ ЭтоПлатеж Тогда
                        // поищем строки удовлетворяющие структуре отбора
                        НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(СтруктураОтбора);
                        // если нашли и их больше 1, то строки не уникальные
                        Если НайденныеСтроки.Количество() > 1 Тогда
                            // добавим строку в список найденных дублей, что бы не сообщать о ней еще раз
    //    ===>                Результат = Ложь;
                            ДублирующиесяСтроки = "";
                            // выведем строку сообщения...
                            Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
                                ДублирующиесяСтроки = ДублирующиесяСтроки + "," + СокрЛП(НайденнаяСтрока.НомерСтроки);
                                // добавим строку в список найденных дублей, что бы не сообщать о ней еще раз
                                СписокНайденныхДублей.Добавить(НайденнаяСтрока);
                            КонецЦикла;
                            СтрокаРеквизитов = "";
                            Для каждого РеквизитТаблицы Из СтруктураОтбора Цикл
                                СтрокаРеквизитов = СтрокаРеквизитов + ?(ПустаяСтрока(СтрокаРеквизитов),"",",") + РеквизитТаблицы.Ключ;
                            КонецЦикла;
                            дкДобавитьОшибку(Ошибки,"Таблица < " + обПолучитьСинонимРеквизита(ЭтотОбъектМетаданные,,Реквизит.Ключ) + " > значения колон" + ?(СтруктураОтбора.Количество() > 1,"ок","ки") + " < " + СтрокаРеквизитов + " > не уникальны ! Строки: " + Сред(ДублирующиесяСтроки,2));
                        КонецЕсли;
                    КонецЕсли;


Вот теперь бы понять, на что кроме дублирование строк в ТЧ частях, влияет данный парамметр. Есть способ это узнать или только в процессе работы, когда-нибудь всплывет?

Автор: Макс1С 13.12.19, 16:27

Цитата(bizisoft @ 13.12.19, 16:22) *
на что кроме дублирование строк в ТЧ частях, влияет данный парамметр

Похоже, что отключает проверку дублей любых колонок во всех документах

Автор: Petre 13.12.19, 18:10

bizisoft @ Today, 16:22 * ,
На отсутствии дублей номенклатуры в тч построены многие механизмы, в т. ч. партионное списание. Так что просто меняйте методику, чтобы не использовать дубли в тч.

Автор: bizisoft 17.12.19, 22:48

Цитата(Petre @ 13.12.19, 19:10) *
На отсутствии дублей номенклатуры в тч построены многие механизмы, в т. ч. партионное списание. Так что просто меняйте методику, чтобы не использовать дубли в тч.

Например в 1С:Предприятие 8.3 (8.3.10.2561) Бухгалтерия для Украины, редакция 1.2. (1.2.44.2) я никакого ограничения в дублях строк в ТЧ я не увидел.
Там получается Партионное списание не используется?

В Альфе я попробовал создать и провести Приходную накладную с двумя-тремя одинаковыми строками, но с разным количеством и ценами.
Так вот в этом случае товар из этих трех строк упал в одну партию со среднеарифметической ценой.

Соответственно, в чем может быть проблема в партионном списании, если товар "упал" в одну партию по средней цене?

Цитата(Макс1С @ 13.12.19, 17:27) *
Похоже, что отключает проверку дублей любых колонок во всех документах

Я это предполагал, но какие еще поля ТЧ кроме Номенклатуры могут еще проверятся на дубли?

Могу предположить, что "Ед.Изм" и "Коэффициент" м "Характеристика номенклатуры".
Но каким образом "Ед.Изм" учавствует, если она почти у всех товаров одинаковая "шт.", "Коэффициент" всегда = 1 (по крайней мере у нас), да и не понятно для чего он вообще нужен.
С "Характеристикой номенклатуры" также не все однозначно, для меня не совсем понятно для чего эта характеристика нужна.

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

Единственно был отмечен такой глюк:
Если в ТЧ есть дубли строк товара и открыть форму ФормаПодбора, в ней выбрать такой же товар, указав некоторое количество и нажать ОтправитьВДокумент, то количество для одноименного товара в ТЧ увеличится на некоторую величину, но фишка в том, что оно увеличится сразу для всех строк дублей. Но этот глюк не приносит слишком больших неудобств и думаю, что его можно как-то обработать.

Каких-то других более серьезных глюков пока не выявлено.

Автор: Макс1С 18.12.19, 2:11

Цитата(bizisoft @ 17.12.19, 22:48) *
Так вот в этом случае товар из этих трех строк упал в одну партию со среднеарифметической ценой.

В бухгалтерии будет тоже самое. Проблемы могут быть при проведении расходных документов с одинаковыми номенклатурами. Мне запомнилось только то, что для правильного списания с дублями строк нужно было практически полностью переделать партионный учет Альфы. Было это почти 3 года назад, конечно, возможно что-то поменялось, но лучше вместе с пользователями сделать масштабный тест, смоделировать как можно больше ситуаций при списании дублей(много партий по 1-2 шт например, а в документе несколько строк с к-вом больше чем остаток в каждой партии и т.д.).
Только что всплыла в памяти ситуация(но это не точно): после расчета себестоимости списания номенклатуры соединение с ТЧ документа происходит только по номенклатуре, т.е. у каждой дублированной строки себестоимость будет одинаковая(не стоимость 1шт , а именно сумма)

Цитата(bizisoft @ 17.12.19, 22:48) *
"Ед.Изм" учавствует, если она почти у всех товаров одинаковая "шт."

ед.изм и Характеристики - подчиненные справочники и та же "шт" для каждой номенклатуры окажется своя, поэтому и контроль включен

Цитата(bizisoft @ 17.12.19, 22:48) *
Я это предполагал, но какие еще поля ТЧ кроме Номенклатуры могут еще проверятся на дубли?

это касается абсолютно всех документов, может же быть ТЧ сотрудников, где тоже нужен контроль уникальности, исходя из этого я бы не стал отключать контроль в глобальной процедуре, а искал бы параметры при вызове этой процедуры в локальном месте

ПС.Ещё раз повторюсь, мой опыт может быть не актуальным на сегодняшний день, мой совет - лишь перестраховаться, если проблемы вылезут после какого-то времени использования, исправлять будет намного сложнее

Автор: Petre 18.12.19, 11:40

QUOTE (bizisoft @ 17.12.19, 22:48) *
Например в 1С:Предприятие 8.3 (8.3.10.2561) Бухгалтерия для Украины, редакция 1.2. (1.2.44.2) я никакого ограничения в дублях строк в ТЧ я не увидел.
Там получается Партионное списание не используется?

Во-первых, это другая конфигурация.
Во-вторых, на сколько я помню, в Бухгалтерия для Украины таблицы при списании партий сворачиваются.

Автор: bizisoft 18.12.19, 23:53

Цитата(Макс1С @ 18.12.19, 3:11) *
Проблемы могут быть при проведении расходных документов с одинаковыми номенклатурами.

Я пробовал три строки одинакового товара, при этом на складах было 3 партии товара.
По первой партии товар был на двух складах, остальные партии были на одном.
Например так
Партия Склад1 Склад2 Себест
№1 2 1 2,00
№2 3 0 10,00
№3 2 0 15,00

В реализации со склада1
Строка № Кол-Во Цена продажи
1 3 4,00
2 2 4,00
3 1 4,00

Цена подставляется 4.00, т.к. последнее Изменение цен была расчитана на 4,00

В итоге:
- по первой строке оно продало 2 шт из Партии №1 по 4.00 и 1 шт из Партии №2 по 4,00, но выдало сообщение что продажа ниже себестоимости, т.к. партия №2 по 10,00. (разница 6,00)
- по второй строке продано 2 шт из Партии №2 по 4.00, также с сообщение ниже себестоимости. (разница 6,00)
- по третьей строке продано 1 шт. из Партии №3 по 4, ниже себестоимости (разница 11,00)

Т.е. как бы так как и задумывалось.

Цитата(Макс1С @ 18.12.19, 3:11) *
ед.изм и Характеристики - подчиненные справочники и та же "шт" для каждой номенклатуры окажется своя, поэтому и контроль включен

Контроль уникальности в Правилах я не отключал, т.к. это приводит к полному отключению всяких проверок, тем более что по вашему совету я просто переделал формирование самих значений реквизита Артикул, что позволило не менять механизм проверки уникальности.

А дублирование строк в ТЧ я отключил закомментировав одну строку кода в ОбщемМодуле дкДокументы в функции дкПроверкаКорректности(...), что влияет только на дублирование реквизита Номенклатура в ТЧ и соответственно никак не влияет на документы в ТЧ-х которых не содержится реквизит Номенклатура, и тем более на справочники.

Цитата(Макс1С @ 18.12.19, 3:11) *
искал бы параметры при вызове этой процедуры в локальном месте

В локальном месте происходит только вызов дкПроверкаКорректности(...) в котором и происходят все проверки.
Я из всей этой функции нашел блок кода, который отвечает на проверку именно дублирования в ТЧ документа и меняет флаг, который уже за пределами этого блока соответствующим образом обрабатывается.

Цитата(Макс1С @ 18.12.19, 3:11) *
мой совет - лишь перестраховаться, если проблемы вылезут после какого-то времени использования, исправлять будет намного сложнее

В своем роде некоторая страховка как бы присутствует, так сказать, всплыла сама собой, а именно - для отмены достаточно снять комментирование со строки и запустить восстановление последовательности документов начиная с периода внесения изменений, соответственно при перепроведении документа с дублями процесс перепроводки будет прерываться и нужно будет удалить дублирующую строку с соответствующем корректированием количеством товара и пересчетом его цены по среднему значению.


Цитата(Petre @ 18.12.19, 12:40) *
Во-первых, это другая конфигурация.
Во-вторых, на сколько я помню, в Бухгалтерия для Украины таблицы при списании партий сворачиваются.

Да я понимаю, что это разные конфг-ии, но просто это различие явно бросалось в глаза. С механизмами работы Бухгалтерии я не очень знаком, т.к. сильно не углублялся в нее, так обходился лишь написанием внешних обработок.

Еще один момент, который мне бросился в глаза, это то, что в бухгалтерии документы с большим количеством строк в ТЧ обрабатываются как-то быстрее (загрузка из файла табличного документа, проведение документов), чем это происходит в Альфе, из-за чего пользователи в Альфе жалуются, что как-то долго приходится ждать 44000000.gif 44000000.gif 44000000.gif , чтобы загрузить данные из файла в ТЧ, а также при проведении (например кол-во строк около 10000 строк).
С чем это может быть связано и возможно-ли в Альфе это оптимизировать и ускорить?

Автор: Petre 19.12.19, 9:24

QUOTE (bizisoft @ 18.12.19, 23:53) *
С чем это может быть связано и возможно-ли в Альфе это оптимизировать и ускорить?

В альфе структура регистров сложнее. К тому же, альфа в плане продуктивности работы с бд слишком устарела. В росийской 5-й версии уже перевели на управляемые блокировки. В 4-й такого нет и не будет, пришлось дорабатывать - намного легче стало жить пользователям. Но если еще и оптимизировать структуру регистров, да перевести на управляемый интерфейс - будет еще лучше. Но это будет уже другая конфигурация...

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua