+ Ответить в теме
Показано с 1 по 9 из 9

Тема: 1С. Простая задачка. ПОМОГИТЕ решить

  1. #1
    Наш Чел Mike-dc кто это? Аватар для Mike-dc
    Регистрация
    07.08.2007
    Адрес
    26
    Возраст
    36
    Сообщений
    232
    Поблагодарил(а)
    26
    Получено благодарностей: 12 (сообщений: 6).

    По умолчанию 1С. Простая задачка. ПОМОГИТЕ решить

    Изучаю 1С и неустанно плююсь! самую простую обработку не могу написать! на C# написал бы за 2 минуты! Помогите!

    Короче нужна обработка, которая коды справочника Номенклатура привела в порядок, а то "тупые бухи" забывают что система сама назначает коды, вместо кода 000024, пишут 024, например, или 0024. Тут я понимаю все просто, пишу:

    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы;
    Пока Спр.получитьЭлемент()=1 Цикл
    Код=Спр.Код;
    Пока СтрДлина(Код)<6 Цикл
    Код="0"+Код;
    КонецЦикла;
    Спр.Код=Код;
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры

    Оно бы и работало, НО! "Тупой бух" не заметил, что есть уже позиция с кодом 000024 и ввел 024, а когда мы прибавляем нули к 024 (Код="0"+Код;), в конце цикла получается 000024, и компилятор говорит что КОД НЕ УНИКАЛЕН. Организую проверку после добавления нулей есть ли уже такой код, если есть, то изменить его, т.е. опять перебираю элементы:

    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы;
    Пока Спр.получитьЭлемент()=1 Цикл
    Код=Спр.Код;
    Пока СтрДлина(Код)<6 Цикл
    Код="0"+Код;
    КонецЦикла;
    Пока Спр.ПолучитьЭлемент()=1 Цикл
    Если Код=Спр.Код Тогда
    Спр.Код="099999";
    КонецЕсли;
    КонецЦикла;

    Спр.Код=Код;
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры

    тут компилятор говорит НЕ ВЫБРАН ЭЛЕМЕНТ Спр.Код=Код;

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

    ПОМОГИТЕ!

    Добавлено через 4 минуты
    не могу понять как перебирать элементы в справочнике
    Последний раз редактировалось Mike-dc; 25.08.2008 в 12:41. Причина: Добавлено сообщение
    a.k.a T0N1k

  2. #2
    Юзер br.Reanimator кто это? Аватар для br.Reanimator
    Регистрация
    02.07.2006
    Возраст
    44
    Сообщений
    175
    Поблагодарил(а)
    3
    Получено благодарностей: 36 (сообщений: 16).

    По умолчанию

    Цитата Сообщение от Mike-dc Посмотреть сообщение
    Изучаю 1С и неустанно плююсь!
    это пройдет.."восьмерка" вообще конфетка
    Хочу чтобы был мир во всем мире!

  3. #3
    Джедай sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе Аватар для sda
    Регистрация
    01.06.2007
    Адрес
    Москва
    Возраст
    46
    Сообщений
    8,326
    Поблагодарил(а)
    303
    Получено благодарностей: 2,545 (сообщений: 1,638).

    По умолчанию

    Исправить ошибку можно так

    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Спр2=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы;
    Пока Спр.получитьЭлемент()=1 Цикл
    Код=Спр.Код;
    Пока СтрДлина(Код)<6 Цикл
    Код="0"+Код;
    КонецЦикла;
    Спр2.ВыбратьЭлементы();
    Пока Спр2.ПолучитьЭлемент()=1 Цикл
    Если Код=Спр2.Код Тогда
    Спр2.Код="099999";
    Спр2.Записать();
    КонецЕсли;
    КонецЦикла;
    Спр.Код=Код;
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры

    Кстати цикл по добиванию до 6-ти элементов можно записать одной строкой
    было:
    Пока СтрДлина(Код)<6 Цикл
    Код="0"+Код;
    КонецЦикла;
    Стало
    Код = Прав("000000"+Код,6);

    Но вообще вся ваша процедура неправильно по смыслу, т.к. потом если еще раз встретится такое дублирование кодов, то код 099999 окажется уже занят.
    Метод следующий - ищете максимальный код (переводите 024 в число 24 и смотрите потом максимальное число). Потом пишете что то вроде
    Спр2.Код = прав("000000"+МаксКод,6);
    МаксКод = МаксКод+1;

  4. 2 пользователей сказали cпасибо sda за это полезное сообщение:

    br.Reanimator (25.08.2008), Mike-dc (25.08.2008)

  5. #4
    Юзер br.Reanimator кто это? Аватар для br.Reanimator
    Регистрация
    02.07.2006
    Возраст
    44
    Сообщений
    175
    Поблагодарил(а)
    3
    Получено благодарностей: 36 (сообщений: 16).

    По умолчанию

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

    пример:

    0024
    0000024
    24
    ...
    =>

    Ю0000001
    Ю0000002
    Ю0000003...

    =>

    00000001
    00000002
    00000003...
    Хочу чтобы был мир во всем мире!

  6. 2 пользователей сказали cпасибо br.Reanimator за это полезное сообщение:

    Mike-dc (25.08.2008)

  7. #5
    Джедай sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе Аватар для sda
    Регистрация
    01.06.2007
    Адрес
    Москва
    Возраст
    46
    Сообщений
    8,326
    Поблагодарил(а)
    303
    Получено благодарностей: 2,545 (сообщений: 1,638).

    По умолчанию

    Согласен с br.Reanimator. Легче просто все пронумеровать заново

  8. #6
    Юзер br.Reanimator кто это? Аватар для br.Reanimator
    Регистрация
    02.07.2006
    Возраст
    44
    Сообщений
    175
    Поблагодарил(а)
    3
    Получено благодарностей: 36 (сообщений: 16).

    По умолчанию

    как посоветовал господин SDA можно тоже. я этот способ не использую, маловато шансов. максимум может быть уже "самым большим"! (999999999..). тогда нельзя будет к нему еще чего-то прибавлять!
    а вот букву всегда можно найти, которой не было использовано

    Добавлено через 3 минуты
    я в шоке! за столько лет увлечения программированием мне такое в голову не приходило..как красиво!

    Стало
    Код = Прав("000000"+Код,6);
    Последний раз редактировалось br.Reanimator; 25.08.2008 в 13:49. Причина: Добавлено сообщение
    Хочу чтобы был мир во всем мире!

  9. #7
    Наш Чел Mike-dc кто это? Аватар для Mike-dc
    Регистрация
    07.08.2007
    Адрес
    26
    Возраст
    36
    Сообщений
    232
    Поблагодарил(а)
    26
    Получено благодарностей: 12 (сообщений: 6).

    По умолчанию

    СПАСИБО!

    не догадался что можно создать ещё один объект Справочник.Номенклатура!
    а код 099999 - эт я знал, что он продублируется. я пока только разбираюсь. я знал что встретится только 1 раз.

    2sda - Код = Прав("000000"+Код,6); - гениально!

    2br.Reanimator - спасибо, нопронумеровать заново проще, чем исправить.

    Блин, как хочется быстрее пройти "барьер" барана в 1С

    Добавлено через 1 час 57 минут
    Цитата Сообщение от sda Посмотреть сообщение
    Исправить ошибку можно так

    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Спр2=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы;
    Пока Спр.получитьЭлемент()=1 Цикл
    Код=Спр.Код;
    Пока СтрДлина(Код)<6 Цикл
    Код="0"+Код;
    КонецЦикла;
    Спр2.ВыбратьЭлементы();
    Пока Спр2.ПолучитьЭлемент()=1 Цикл
    Если Код=Спр2.Код Тогда
    Спр2.Код="099999";
    Спр2.Записать();
    КонецЕсли;
    КонецЦикла;
    Спр.Код=Код;
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры
    неверно. потому что в самом начале: Код=Спр.Код, а потом когда проверка на уникальность сразу есть проход в "если" при условии Код=Спр2.Код.
    Последний раз редактировалось Mike-dc; 25.08.2008 в 16:00. Причина: Добавлено сообщение
    a.k.a T0N1k

  10. #8
    Джедай sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе sda Разбег по полосе Аватар для sda
    Регистрация
    01.06.2007
    Адрес
    Москва
    Возраст
    46
    Сообщений
    8,326
    Поблагодарил(а)
    303
    Получено благодарностей: 2,545 (сообщений: 1,638).

    По умолчанию

    Цитата Сообщение от Mike-dc Посмотреть сообщение

    неверно. потому что в самом начале: Код=Спр.Код, а потом когда проверка на уникальность сразу есть проход в "если" при условии Код=Спр2.Код.
    Да действительно, при проверке на уникальность элемент справочника наткнется на себя же и решит что он не уникален. Действительно легче перенумеровать весь справочник. Но можно усложнить еще вот так:
    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Спр2=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы;
    Пока Спр.получитьЭлемент()=1 Цикл
    Код=Спр.Код;
    Пока СтрДлина(Код)<6 Цикл
    Код="0"+Код;
    КонецЦикла;
    Если Код = Спр.Код Тогда
    Продолжить;//код не изменился, делать ничего не надо - код справочника хороший
    КонецЕсли;
    Спр2.ВыбратьЭлементы();
    Пока Спр2.ПолучитьЭлемент()=1 Цикл
    Если Код=Спр2.Код Тогда
    Спр2.Код="099999";
    Спр2.Записать();
    КонецЕсли;
    КонецЦикла;
    Спр.Код=Код;
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры

  11. 1 пользователь сказал cпасибо sda за это полезное сообщение:

    Mike-dc (25.08.2008)

  12. #9
    Наш Чел Mike-dc кто это? Аватар для Mike-dc
    Регистрация
    07.08.2007
    Адрес
    26
    Возраст
    36
    Сообщений
    232
    Поблагодарил(а)
    26
    Получено благодарностей: 12 (сообщений: 6).

    По умолчанию

    Буду знать что тут есть такое отличная команда ПРОДОЛЖИТЬ ) как мне её не хватало!!

    Добавлено через 44 минуты
    Уфф! Как же все таки трудно дается!! Но готово:
    &#207;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&# 224; &#209;&#244;&#238;&#240;&#236;&#232;&#240;&#238;&# 226;&#224;&#242;&#252;()
    &#209;&#239;&#240;=&#209;&#238;&#231;&#228;&#224;& #242;&#252;&#206;&#225;&#250;&#229;&#234;&#242;("& #209;&#239;&#240;&#224;&#226;&#238;&#247;&#237;&#2 32;&#234;.&#205;&#238;&#236;&#229;&#237;&#234;&#23 5;&#224;&#242;&#243;&#240;&#224;");
    &#209;&#239;&#240;2=&#209;&#238;&#231;&#228;&#224; &#242;&#252;&#206;&#225;&#250;&#229;&#234;&#242;(" &#209;&#239;&#240;&#224;&#226;&#238;&#247;&#237;&# 232;&#234;.&#205;&#238;&#236;&#229;&#237;&#234;&#2 35;&#224;&#242;&#243;&#240;&#224;");
    &#209;&#239;&#240;3=&#209;&#238;&#231;&#228;&#224; &#242;&#252;&#206;&#225;&#250;&#229;&#234;&#242;(" &#209;&#239;&#240;&#224;&#226;&#238;&#247;&#237;&# 232;&#234;.&#205;&#238;&#236;&#229;&#237;&#234;&#2 35;&#224;&#242;&#243;&#240;&#224;");
    &#196;&#235;&#255; &#194;&#241;&#239;&#238;&#236;=1 &#207;&#238; 10 &#214;&#232;&#234;&#235;
    &#209;&#239;&#240;3.&#194;&#251;&#225;&#240;&#224; &#242;&#252;&#221;&#235;&#229;&#236;&#229;&#237;&# 242;&#251;();
    &#204;&#224;&#234;&#241;&#202;&#238;&#228;=&#215;& #232;&#241;&#235;&#238;(&#209;&#239;&#240;3.&#202; &#238;&#228;);
    &#207;&#238;&#234;&#224; &#209;&#239;&#240;3.&#207;&#238;&#235;&#243;&#247; &#232;&#242;&#252;&#221;&#235;&#229;&#236;&#229;&# 237;&#242;()=1 &#214;&#232;&#234;&#235;
    &#197;&#241;&#235;&#232; &#215;&#232;&#241;&#235;&#238;(&#209;&#239;&#240;3 .&#202;&#238;&#228;)>&#204;&#224;&#234;&#241;&#202 ;&#238;&#228; &#210;&#238;&#227;&#228;&#224;
    &#204;&#224;&#234;&#241;&#202;&#238;&#228;=&#215;& #232;&#241;&#235;&#238;(&#209;&#239;&#240;3.&#202; &#238;&#228;);
    &#202;&#238;&#237;&#229;&#246;&#197;&#241;&#235;&# 232;;
    &#202;&#238;&#237;&#229;&#246;&#214;&#232;&#234;&# 235;&#224;;
    &#209;&#239;&#240;.&#194;&#251;&#225;&#240;&#224;& #242;&#252;&#221;&#235;&#229;&#236;&#229;&#237;&#2 42;&#251;();
    &#207;&#238;&#234;&#224; &#209;&#239;&#240;.&#207;&#238;&#235;&#243;&#247;& #232;&#242;&#252;&#221;&#235;&#229;&#236;&#229;&#2 37;&#242;()=1 &#214;&#232;&#234;&#235;
    &#202;&#238;&#228;=&#209;&#239;&#240;.&#202;&#238; &#228;;
    &#207;&#238;&#234;&#224; &#209;&#242;&#240;&#196;&#235;&#232;&#237;&#224;(& #202;&#238;&#228;)<9 &#214;&#232;&#234;&#235;
    &#202;&#238;&#228;="0"+&#202;&#238;&#228;;
    &#202;&#238;&#237;&#229;&#246;&#214;&#232;&#234;&# 235;&#224;;
    &#197;&#241;&#235;&#232; &#202;&#238;&#228; = &#209;&#239;&#240;.&#202;&#238;&#228; &#210;&#238;&#227;&#228;&#224;
    &#207;&#240;&#238;&#228;&#238;&#235;&#230;&#232;&# 242;&#252;;
    &#202;&#238;&#237;&#229;&#246;&#197;&#241;&#235;&# 232;;
    &#209;&#239;&#240;2.&#194;&#251;&#225;&#240;&#224; &#242;&#252;&#221;&#235;&#229;&#236;&#229;&#237;&# 242;&#251;();
    &#207;&#238;&#234;&#224; &#209;&#239;&#240;2.&#207;&#238;&#235;&#243;&#247; &#232;&#242;&#252;&#221;&#235;&#229;&#236;&#229;&# 237;&#242;()=1 &#214;&#232;&#234;&#235;
    &#197;&#241;&#235;&#232; &#202;&#238;&#228;=&#209;&#239;&#240;2.&#202;&#238 ;&#228; &#210;&#238;&#227;&#228;&#224;
    &#209;&#239;&#240;2.&#202;&#238;&#228;=&#204;&#224 ;&#234;&#241;&#202;&#238;&#228;+1;
    &#209;&#239;&#240;2.&#199;&#224;&#239;&#232;&#241; &#224;&#242;&#252;();
    &#202;&#238;&#237;&#229;&#246;&#197;&#241;&#235;&# 232;;
    &#202;&#238;&#237;&#229;&#246;&#214;&#232;&#234;&# 235;&#224;;
    &#209;&#239;&#240;.&#202;&#238;&#228;=&#202;&#238; &#228;;
    &#209;&#239;&#240;.&#199;&#224;&#239;&#232;&#241;& #224;&#242;&#252;();
    &#202;&#238;&#237;&#229;&#246;&#214;&#232;&#234;&# 235;&#224;;
    &#202;&#238;&#237;&#229;&#246;&#214;&#232;&#234;&# 235;&#224;;
    &#202;&#238;&#237;&#229;&#246;&#207;&#240;&#238;&# 246;&#229;&#228;&#243;&#240;&#251;

    Добавлено через 46 минут
    апплодисменты в студийу!

    у меня виста. и кодировка "текущая системная". так что прошу прощения.
    Последний раз редактировалось Mike-dc; 25.08.2008 в 20:24. Причина: Добавлено сообщение
    a.k.a T0N1k

+ Ответить в теме

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

     

Похожие темы

  1. Помогите разобраться как работает схема
    от Радиотехник в разделе Радиоэлектроника
    Ответов: 0
    Последнее сообщение: 18.05.2008, 01:20
  2. ПОмогите с ASP C#
    от loginpogin в разделе Языки
    Ответов: 9
    Последнее сообщение: 12.04.2008, 16:19
  3. Помогите найти собаку
    от инна в разделе Животные и растения
    Ответов: 3
    Последнее сообщение: 29.01.2008, 13:41
  4. Простая, но интересная задача
    от Sepultura в разделе Интересное
    Ответов: 95
    Последнее сообщение: 11.01.2008, 12:56
  5. Помогите плз. решить проблемку с Siemensом
    от Молодой Человек в разделе Mobile
    Ответов: 13
    Последнее сообщение: 15.05.2007, 23:02

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru
Администрация сайта не выражает согласия
с высказыванием участников форума и не несет
ответственности за их содержание.

Копирование любого материала возможно только
при наличии ссылки на сайт.