gifts2017

Глюк 1С….?

Опубликовал Александр Шишкин (Шёпот теней) в раздел Программирование - Практика программирования

Работая со справочником "Должности организаций", никак не мог получить элемент по коду по следующему коду программы:

кодПроф = "22446";  //наименование по справочнику -  инженер;
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);

1С на это послание ничего мне отвечает… Естественно, потратил «кучу» времени на выяснение причин… в итоге написал такой проверочный код:

Платформа: 1С:Предприятие 8.0 (8.0.17.25)
Конфигурация: УПП, редакция 1.2 (1.2.5.1)

//
// справочник.ДолжностиОрганизаций ТипКод: строка; ОсновноеПредставление: В виде наименования;
Сообщить("справочник.ДолжностиОрганизаций");
кодПроф = 22446; // число инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("число код "+ссПроф.Код+" "+ссПроф.Наименование);
//
кодПроф = "22446"; //строка" инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка код "+ссПроф.Код+" "+ссПроф.Наименование);
//
// справочник.ФизЛица; ТипКод: строка; ОсновноеПредставление: В виде наименования;
Сообщить("справочник.ФизическиеЛица");
кодФЛ1 = 670001119; // число ФИО работника орг
кодФЛ2 = "670001119"; // строка ФИО работника орг
//
кодФизЛицас1 = Справочники.ФизическиеЛица.НайтиПоКоду(кодФЛ1);
Сообщить("число код "+кодФизЛицас1.Код+" "+кодФизЛицас1.Наименование);
//
кодФизЛицас1 = Справочники.ФизическиеЛица.НайтиПоКоду(кодФЛ2);
Сообщить("строка код "+кодФизЛицас1.Код+" "+кодФизЛицас1.Наименование);
//
//1С отвечает:
//
//справочник.ДолжностиОрганизаций
//число код 22 446 ИНЖЕНЕР
//строка код 
//
//справочник.ФизическиеЛица
//число код 
//строка код 670001119 КОРНЕЕВА МАРИНА ВИКТОРОВНА //

Получается, справочник.ДолжностиОрганизаций его код заявлен как «строка» но требует «число».

Воо-о-оот такие у меня дела….

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил Ражиков (tango) 19.03.08 10:40
может в том, что код - строка, длина - 9?
если строкой - то все девять знаков надо, а если числом - то она сама выполняет преобразование типа?
__
а вообще надо название начать с "8х: знаете ли вы платформу"
2. Александр Шишкин (Шёпот теней) 19.03.08 11:01
(1) СПАСИБО tango за сообщение...

пробовал... доводил текст до 9 символов ... результат тот же...


во-о-оот...
3. Андрей Скляров (coder1cv8) 19.03.08 11:06
Та не, какой глюк? Просто код - это строка фиксированной длины, соответственно, если мы забиваем код меньший по длине, то справа он дополняется пробелами... В результате Код у тебя действительно не равен "22446", а равен скорее всего "22446 ". Вот такие вот дела... Отсюда вывод, пользуйтесь автоматически сформированными кодами или, если уж приспичило, добавляйте нолики до нужной длины строки.
4. Андрей Скляров (coder1cv8) 19.03.08 11:08
+(3) Пробелы порезались :) я иммел ввиду 22446+4 пробела :)
5. Александр Шишкин (Шёпот теней) 19.03.08 11:09
(1) может в том, что код - строка, длина - 9?
если строкой - то все девять знаков надо, а если числом - то она сама выполняет преобразование типа?

вопрос: если обозначить код числом, тогда почему не найден, в справочнике.ФизЛица, элемент...? в таком случае...? а только по заданию кода "строкой"...

воо-о-от...
6. Александр Шишкин (Шёпот теней) 19.03.08 11:15
для всех кому интересно:

пишу:
//
// справочник.ДолжностиОрганизаций ТипКод: строка; ОсновноеПредставление: В виде наименования;
Сообщить("справочник.ДолжностиОрганизаций");
//
кодПроф = 22446; // число инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("число код "+ссПроф.Код+" "+ссПроф.Наименование);
// 123456789
кодПроф = "22446"; //строка инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка без код "+ссПроф.Код+" "+ссПроф.Наименование);
// 123456789
кодПроф = "22446 "; //строка до 9 символов инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка 9 символов код "+ссПроф.Код+" "+ссПроф.Наименование);
//
Ответ 1С:
справочник.ДолжностиОрганизаций
число код 22 446 ИНЖЕНЕР
строка без код
строка 9 символов код

написал всё дословно....

воо-оо-оот...
7. Александр Шишкин (Шёпот теней) 19.03.08 11:34
кому интересно:

написал следущий код:

//
// справочник.ДолжностиОрганизаций ТипКод: строка; ОсновноеПредставление: В виде наименования;
Сообщить("справочник.ДолжностиОрганизаций");
// 123456789
кодПроф = "22 446"; //строка "22_446" инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка ""22_446"" 6 символов код "+ссПроф.Код+" "+ссПроф.Наименование);
// 123456789
кодПроф = "22 446 "; //строка "22_446___" инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка ""22_446____"" 9 символов код "+ссПроф.Код+" "+ссПроф.Наименование);

получил от 1С:
//
справочник.ДолжностиОрганизаций
строка "22_446" 6 символов код 22 446 ИНЖЕНЕР
строка "22_446____" 9 символов код 22 446 ИНЖЕНЕР


воо-о-от такие дела....

обнаружил... в справочники.ДожностиОрганизации коды указаны с пробелом например: "22_446"...
8. Александр Шишкин (Шёпот теней) 19.03.08 12:12
ну, и, уж кому совсем интересно:

После всех мытарств, выводы:

Первое:
Строки:
//
кодПроф = "22447"; //строка "22447" 5 символов - «инженер а»
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка ""22447"" 5 символов код "+ссПроф.Код+" "+ссПроф.Наименование);
//
кодПроф = "22447 "; //строка "22_446___" 9 символов «инженер а»
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("строка ""22447____"" 9 символов код "+ссПроф.Код+" "+ссПроф.Наименование);
//
Для 1С - идентичны, будет выдан результат один и тот же: «инженер а»
Ввёл в справочник.ДолжностиОрганизаций код: 22447 и наименование: «инженер а»

На строку:
//
кодПроф = 22447; //число 22447 5 символов «инженер а»
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("число ""22447"" 5 символов код "+ссПроф.Код+" "+ссПроф.Наименование);
//
1с не ответила….

Второе:
В справочники.ДолжностиОрганизаций введены коды должностей через пробел, вместо «22446____» ввели «22_446___» вследствии этого стали возможны следующие строки:
//
кодПроф = 22446; // число инженер
ссПроф = справочники.ДолжностиОрганизаций.НайтиПоКоду(кодПроф);
Сообщить("число код "+ссПроф.Код+" "+ссПроф.Наименование);
//
Где 1С запросто давала ответ, но не давала ответ на строку типа «22446» или «22446____»…


Воо-о-от и все выводы…. …и такие вооо-о-оот интересные особенности бухгалтерской и программной работы на местах….


П.С. ...кого "достало" может ставить БОЛЬШИЕ минусы...

Удачи… всем...!
9. Александр Шишкин (Шёпот теней) 19.03.08 13:53
ну и совсем уже обнаглев, мне уж это стало интересным, можете сделать смелый творческий эксперемент:

Можно ввести в любой справочник, в котором код обозначен строкой, и где в программе 1С работает штатно или принудительно группировка чисел: "ЧГ=3,0" новый элемент, например:

// создать элемент справочника
Новый_Код = 123123; //(или с форматной строкой новыйКод = формат(123123, "ЧГ=3,0"); )
новое_Наименование = “здесь был Вася”;
//
….
// записать(); элемент;

И задать следующую строку поиска по коду:

Спр.ИскомыйСправочник.НайтиПоКоду(123123).Наименование; //123123 как «число» и вам ответят: “здесь был Вася”;

А на поиск «123123» , как строка, ответят молчанием… и на «123_123» тем же и на «123_123__» тем же…. и только на строку где кодом будет:
спрКод = "3"+Символы.НПП+"331"+Символы.НПП+"111"; вам "Вася" ответит положительно...!


Только вот проблема: в поиске, в справочнике, по коду, не сможете отыскать нужный вам элемент ни в построчном, ни в общем поиске дальше цифр до первого
пробела...

воо-оо-от такие метаморфозы….

всем удачи...
10. Михаил Ражиков (tango) 19.03.08 14:11
Ок. резюме: неразрывный пробел в некоторых случаях имеет место быть (при задании строкового кода числом), в некоторых - нет (при поиске по коду).
Что считать глюком - не понятно, толи в первом случае (а с какой стати?), толи во втором (опять же - с какой стати?). в любом случае казус проходит по разряду "знаете ли вы платформу" :))
11. Михаил Ражиков (tango) 19.03.08 14:31
Шепот, замути мульку "поиск неразрыных пробелов в кодах справочников", получишь ++++
пока - авансом, за мысль :)
12. Александр Шишкин (Шёпот теней) 19.03.08 15:13
...tango Спасибо за все твои сообщения, пожелания, действия...

маленькое П.С.: являясь человеком очень неуверенным с т.з. "высказывать своё мнение" и осознавая свой "опыт" постижения 1С в целом и 1С 8.0 в частности, именно поэтому заголовок данной ветки и озвучен как: "гЛЮк 1С….?", именно с вопросительным знаком... "?" - это же "вопросительный" знак....?

воо-о-оот такой блин сегодня получился почти диалог-с....

СПАСИБО.... и.... УДАЧИ...
13. Михаил Ражиков (tango) 19.03.08 15:24
Есть шанс иметь это грабло и в номерах доков. Так что - замути, хуже не будет. Уже.
пс: будешь в наших краях - дай знать :)
14. Александр Шишкин (Шёпот теней) 19.03.08 15:29
... и всё можно было бы улыбнуться читая "всё это", но только одно но: наши бухгалтера, например запросто могут организовать в справочниках не только "задва"ения но и "три" и "пять"-двоений, уж как пример, на прошлой моей работе наши бухи умудрились одну и туже улицу "обозвать" 17-ю разными именами... воо-о-оот...

в данном случае обнаружили, что у нас разные "инженер-технолог"-и их было два, с разными кодами и целых трое "инженеров"... в итоге должность есть, их три и они все разные

как всегда, бухи а это наши милейшие существа - женщина, кричат (орут), жалуются на 1С, друг – на - друга, и объединившись общим, дружным порывом объявили виноватым наш доблестный отдел АСУ.... ну-ууу и началось....

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

воо-о-оот такая "грусть" история...

п.с. спасибо tango…

удачи!...
15. Poppy (poppy) 19.03.08 23:46
Имхо рассматриваемая проблема состоит в том, что при преобразовании из числа в строку восьмерка, в отличии от семерки производит преобразование к региональным особенностям. В частности, перед каждым третьим разрядом добавляется неразрывный пробел.
Т.е. число 123123 не равно строке "123123", но равно строке "123(пробел)123".

Соответственно, при выполнении кода Спр.Код = 123123; на самом деле будет выполнено Спр.Код = "123(пробел)123".
При выпонении НайтиПоКоду("123123") ничего не найдено, а при НайтиПоКоду(123123) будет найден созданный ранее элемент, также как и пр Спр.НайтиПоКоду("123(пробел)123").

Имхо надо избегать таких значений в качестве кодов элементов, поэтому лучше явно преобразовавать число в строку Спр.Код = Формат(123123, "ЧГ=0");

З.Ы. Мне показалось, что неразрывный пробел в коде подменяется обычным.
16. Poppy (poppy) 19.03.08 23:48
(14)
Как всегда бухши виноваты?

Зачем было что-то кодить? Ведь можно было воспользоваться обработкой ПоискИЗаменаЗначений.epf с диска ИТС?
17. Мурат Жананов (murat_) 20.03.08 07:47
Мне кажется, изначально нужно административно запрещать изменять код пользователям, хоть в доках, хоть в справочниках.
18. Александр Шишкин (Шёпот теней) 20.03.08 07:51
(16)

не-ееее, дорогая poppy!

бухши как всегда не виноваты....? у них работа такая не быть виноватыми, они же женщины... они, что дуры....

моё опыт, рисует мне такую картину, повторяющуюся в 80% случаях... крик... гам... в дружных рядах женского гарема под названием "Бухгалтерия" ... что-то не "идёт".... или что "утеряно".... все бегают ищут, вспоминают... потом дружно обвиняют АСУ.... в итоге... проблема лежала в области "бухгалтерского учёта" а не в программе.... но никогда еще ни одна бухша не извинилась.... и считает это рабочей средой.... гы.... получается, что 80 % всех вопросов от бухш их же собственные, но путём обвинения АСУ они их прекрасно решают не за свой счёт.... за свой дорого и читать надо, или думать.... или "попу" поднять....

воо-оо-оот такие не веселые мысли о бухш-ах.... но они не виноваты.... "весна" - однако... полететь охота.... или улететь... ветер одним словом - зашелестел...

П.С. .... а насчёт ИТС... у нас их не выписывют... опять же бухи говорят.... эконмить надо.... а нам, это им значит, это не надо.... они и так всё знают.... видали мы ваши диски, типа, ничего там хорошоге нету... после этого ни о книгах, ни о журналах даже и не заикаемся... ладно хоть интернет не перекрывают... Экономика... блин её с бухшами....

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

воо-оо-от ...
19. Аркадий Кучер (Abadonna) 20.03.08 08:48
>... вернее прошу вашу фотография на память
Губозакаточную машинку подарить? ;)
20. larissa builova (larisab) 20.03.08 09:54
<моё опыт, рисует мне такую картину, повторяющуюся в 80% случаях... крик... гам... в дружных рядах женского гарема под названием "Бухгалтерия" ... что-то не "идёт".... >
е еще знаменитое тошнотворное - "не село"!!!
21. Александр Шишкин (Шёпот теней) 20.03.08 11:16
(19) подари abadonna ... от тебя с радостью... приму... и память будет на всю жизнь … :-)))
(20) !!!
22. Victor Nespyatin (victuan) 26.03.08 06:23
ИМХО: Какой-то у "Шепота теней" тошнотворный стиль изложения материала (прошу прощения за оцену) - еле дочитал ветку до конца!
23. VasilyKushnir (vasilykushnir) 26.03.08 08:34
(22) Не стреляйте в пианиста - он играет, как умеет...
24. Marsel (MagSolD) 20.02.09 11:52
Йееех... Всем привет)

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