Обсуждение накопленного

Автор Харлампий Дымба, 14 октября 2025, 01:31

« назад - далее »

Харлампий Дымба

8000 копий для анализа и уйма времени  - чтобы принести это бесполезное хрустальное знание :)  Спасибо за интерес, без дураков.

Смотри, дело вообще не в данных. Дело в том, что в результате обычного объединения получается битый мдшник.
Возьми свою лучшую конфу, просто чистый мдшник, и разложи в две папки.
1) В конфе 1 добавь константу и сохрани.
2) В конфе 2 добавь общий реквизит документа и выведи его в колонку в любом журнале.
3) Накати на конфу 1 мдшник от конфы 2 стандартным объединением и сохрани.
А теперь "Джентльмены, подходим ближе: вот он есть (в конфигураторе ты колонку в журнале видишь) , а вот его нет (в режиме "1С: Предприятия" ты колонку не видишь).

Вообще у фокуса есть продолжение: если теперь удалить константу, и попробовать объединять конфигурации, то 1С будет говорить, что "Конфигурации идентичны". При этом конфа 1 будет битая (колонка пользователям не видна), а конфа 2 нормальная (колонка пользователям видна).

PS ИдентификаторМетаданных - это внутренний id реквизита в конфигураторе.



Харлампий Дымба

Цитата
PS ИдентификаторМетаданных - это внутренний id реквизита в конфигураторе.
Лучше так:
ИдентификаторМетаданных - это внутренний id объекта метаданных в конфигурации.

Злоп


 ИдентификаторМетаданных не изменяется вслед за изменением Идентификатора исходного объекта (например, общего реквизита «Автор»), а остаётся как был в накатываемой конфигурации
.
Накатываемая конфигурация - п2.
Что такое Идентификатор исходного объекта? - это есть идентификатор метаданных общего реквизита "автор" в п2? В П2 все в порядке с мд, он небитый? "Идентификатормптаданных" - в твоем приложении - он где, в П1? Если он не меняется и остается как был в П2 - откуда в п1 битый мд?
Твое предложение для меня набор каких-то несвязных слов, который вообще не склеивается с описанием воспроизводства проблемы... Можешь это свое предложение перефразировать как-то по-другому, понятнее...?

Харлампий Дымба

Любой объект, который ты создаёшь в конфигурации получает внутренний id (идентификатор метаданных) - число от 1 и далее:
...
         1   Задача
       475   ОбщийРеквизитДокумента.Комментарий
     66404   ОбщийРеквизитДокумента.новый1
       476   ГрафаОтбора.Контрагент
       471   Нумератор.АктОС1
       472   Нумератор.ПриходныйОрдерМ4
     58672   Нумератор.СчетаФактуры
        12   Константа.ДатаРегистрации
        13   Константа.НазваниеОрганизации
...

Упрощенно:
Пусть у тебя в исходной конфигурации 1000 объектов.
Когда ты создал в П1 константу (пусть "ОГРН")она получила id = 1001.
Когда ты создал в П2 общий реквизит документа (пусть "Автор") он тоже получит id = 1001
Когда ты накатываешь на П1 объединением конфигурацию П2, то id добавляемого общего реквизита уже занят (он присвоен константе ОГРН) и общий реквизит "Автор" получает новый id = 1002.
И вот тут упущение - в колонке журнала ссылка не изменяется (а должна!) и остается - id 1001. Т.е в колонке журнала вместо Автора будет выводится Константа.ОГРН. Но в качестве заплатки 1С в таком случае просто не показывает эту колонку вообще.

Ну это же проще 1 раз увидеть, чем 7 раз услышать. Поэтому
Цитата
...возьми свою лучшую конфу, просто чистый мдшник, и разложи в две папки..

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


Злоп

Сразу бы так написать... ;-)

Харлампий Дымба

Цитата: amo|obs от 16 ноября 2025, 17:22Не добавляется в список значений значение неопределенного типа данных!
Действительно, ДобавитьЗначение и ВставитьЗначение ничего не делают с пустотой.
Но если очень хочется, то можно:
Список = СоздатьОбъект("СписокЗначений");
Список.ДобавитьЗначение("займём местчеко");
Список.УстановитьЗначение(Список.РазмерСписка,);
Сообщить(ЗначениеВСтрокуВнутр(Список));//список из одного пустого элемента


Харлампий Дымба

Недокументированное поведение метода СписокЗначений::Установить(<Строка>, <Знач>)
Если опустить параметр <Знач>, то:
если в списке есть элемент с представлением <Строка>, то он будет удален из списка
если в списке нет элемента с представлением <Строка>, то будет добавлено пустое значение с представлением <Строка>.
Код для иллюстрации:
Список = СоздатьОбъект("СписокЗначений");
Список.Установить("Процент",100);
Сообщить(Список.РазмерСписка()); //1 элемент - значение с представлением "Процент" - добавлено
Список.Установить("Процент");
Сообщить(Список.РазмерСписка()); //0 - значение с представлением "Процент" было найдено и удалено
Список.Установить("Процент");
Сообщить(Список.РазмерСписка()); //1 - значение с представлением "Процент" не было найдено и поэтому добавлено

Злоп

СЗ неисчерпаем. Как атом.

Злоп

Цитата: Харлампий Дымба от 10 декабря 2025, 15:35Но если очень хочется, то можно:

Интересно, что даст ПустоеЗначение(Список)

;-)

Злоп

Фичи с СЗ - перенес в Копилку

Харлампий Дымба

Битый час пытался воткнуть, что сломалось в Отладчике - оказалось багофича 1с:
Отладчик не видит локальные переменные глобального модуля в глобальных процедурах и функциях, вызванных из других мест.
При попытке вычислить выражение даёт ошибку типа:
"ЛокальнаяПеременнаяГлобальногоМодуля = Ошибка в выражении!"
При этом всё нормально работает, переменная имеет значение. Но вот Отладчик её отказывается показывать.

Чтоб было понятнее - глобальный модуль такой:
Перем ЛокальнаяПеременнаяГлобальногоМодуля;
Процедура Проверка() Экспорт
    ЛокальнаяПеременнаяГлобальногоМодуля = 1;
КонецПроцедуры
ЛокальнаяПеременнаяГлобальногоМодуля = 0;

Вызов из обработки такой:
Процедура Сформировать()
    Проверка()
КонецПроцедуры

Похожая фишка, насколько помню, есть и объекта "Запрос", но вот на такой каприз Отладчика до сего дня не натыкался.



Харлампий Дымба

Ещё одна багофича 1С, связанная с функциями УчетПоКоличеству() и УчетПоВалютнойСумме() - флаги учета по "По количеству" и "По сумме" по указанному виду субконто:
КолУчетПоСубконто1...3 = СчетПоКоду("26").УчетПоКоличеству(1...3);// = 1, хотя количественного учета по аналитике сч.26 отродясь не было
ВалУчетПоСубконто1...3 = СчетПоКоду("26").УчетПоВалютнойСумме(1....3);//  = 1, хотя валютного учета по аналитике сч.26 отродясь не было
Это происходит потому, что 1Ска ленится скидывать неиспользуемые флаги при редактировании метаданных (такое много где встречается и приводит к разным багам). Типа если по счету в целом нет количественного учета, то неважно состояние флагов "Учет по количеству" для всех субконто этого счета, поэтому не будем с ними ничего делать и оставим их как были. Пользователю эти флаги видны как неустановленные и недоступны для редактирования, при этом на самом деле флаги установлены. Можно в любой типовой конфе с планом счетом убедиться, что по неколичественным счетам у субконто флаг снят (т.е. "НЕТ"), но при выводе "Описания структуры метаданных" для всех субконто счета значение реквизита "УчетПоКоличеству" будет равно "ЕСТЬ". С валютой аналогично.
Так что правильное использование этих функций - с использованием атрибутов счета "Количественный" и "Валютный":
КолУчетПоСубконто1...3 = ?(Счет.Количественный = 0, 0, Счет.УчетПоКоличеству(1...3));
ВалУчетПоСубконто1....3 = ?(Счет.Валютный = 0, 0, Счет.УчетПоВалютнойСумме(1...3));

Можно было бы назвать это не багом, а особенностью - так как в описании функции именно такое поведение функций и задекларировано: "Функция возвращает значение флага ...".
Но во-первых даже в вылизанной за десятилетия ОСВ по счету в типовой бухии есть именно эта ошибка - использование функции "УчетПоКоличеству" без оглядки на сам счёт. Ошибка незначительная по последствимя - из-за неё выводятся лишние пустые секции в печатной форме, но всё же.
А во-вторых возможно, что и в других местах 1С будет смотреть на флаг по субконто, игнорируя флаг по счету.

Харлампий Дымба

Не знаю как лучше классифицировать этот баг 1С, долго ловил и, думаю, поймал.
При некоторых условиях использование "Окна-Закрыть все окна" приводило к появлению окошка "Ошибка при выполнении модуля! Закрыть?" и последующему падению 1С независимо от ответа пользователя.

Проблема возникает, если выполняются следующие условия:
1. Открыта форма подбора;
2. В форме подбора установлен флаг множественного выбора;
3. В форме подбора установлен флаг выбора групп и справочник многоуровневый;
4. Форма подбора находится на заднем плане относительно вызвавшой формы;
5. Пользователь выбирает пункт меню "Окна - Закрыть все  окна".
Если любой из этих пунктов убрать - всё гладко.

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

Можно поиграться с другими отчетами и фильтрами, чтобы увидеть разницу поведения из-за п.3.