Глюк 1С….?

19.03.08

Разработка - Механизмы платформы 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С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    7696    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6081    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    18249    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23894    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14935    YA_418728146    7    

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

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


во-о-оот...
5. Шёпот теней 1782 19.03.08 11:09 Сейчас в теме
(1) может в том, что код - строка, длина - 9?
если строкой - то все девять знаков надо, а если числом - то она сама выполняет преобразование типа?

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

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

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

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

воо-оо-оот...
7. Шёпот теней 1782 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. Шёпот теней 1782 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. Шёпот теней 1782 19.03.08 13:53 Сейчас в теме
ну и совсем уже обнаглев, мне уж это стало интересным, можете сделать смелый творческий эксперемент:

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

удачи!...
16. poppy 19.03.08 23:48 Сейчас в теме
(14)
Как всегда бухши виноваты?

Зачем было что-то кодить? Ведь можно было воспользоваться обработкой ПоискИЗаменаЗначений.epf с диска ИТС?
18. Шёпот теней 1782 20.03.08 07:51 Сейчас в теме
(16)

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

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

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

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

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

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

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

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

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

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

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