Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: V7.7 Рарус. ТехКарта программно, кто-нибудь сможет помочь?  (Прочитано 17838 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Woodall
Интересующийся

ru
Offline Offline

« : 25-12-2010 04:14 » 

Доброго всем времени суток!

Так и не смог найти ответ на вопрос на форуме.
Вопрос состоит в следующем:
Позаказное индивидуальное мебельное производство, т.е. все проекты разные. Разработка проектов ведется в К3. Задача: автоматизировать передачу данных из К3 в 1С. Стандартный модуль загрузки заказов из К3 формирует Множественное задание на производство, которое нам не подходит. Попробовали переделать модуль на формирование Задания на производство, после импорта материалы СРАЗУ списываются. Получилось только создание техкарты, с материалами нет проблем, а вот как в нее программно добавить производственные операции?

Хотелось бы вот этот код изменить типа:
Если КодНоменклатуры=«такой-то» тогда добавить материал иначе добавить операцию

ДокТехКарта=СоздатьОбъект("Документ.ТехнологическаяКарта");
Для к=НомерЗаписи по БД_Материалы.КоличествоЗаписей() Цикл
КодНоменклатуры=СокрЛП(БД_Материалы.MATID);
НаимНоменклатуры=СокрЛП(БД_Материалы.MATNAME);
Номенклатура=ПолучитьНоменклатуру(КодНоменклатуры,НаимНоменклатуры,"Материалы");
КодЕд=СокрЛП(БД_Материалы.UNITID); НаимЕд=СокрЛП(БД_Материалы.UNITNAME);
ДокТехКарта.НоваяСтрока();
ДокТехКарта.Номенклатура=Номенклатура;
ДокТехКарта.Количество=БД_Материалы.COUNT;
ДокТехКарта.Единица=ПолучитьЕдиницу(Номенклатура,КодЕд,Наимед);
БД_Материалы.Следующая();
КонецЦикла;
тз=СоздатьОбъект("ТаблицаЗначений");
ДокЗадание.ВыгрузитьТабличнуюЧасть(тз);

Может кто-то сталкивался с таким вопросом, подскажите, пожалуйста, как можно это реализовать?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-12-2010 08:15 » 

Судя по коду - эта проверка должна выполняться внутри функции ПолучитьНоменклатуру() - смотрите ее
Записан
Woodall
Интересующийся

ru
Offline Offline

« Ответ #2 : 25-12-2010 09:14 » new

Возможно, я не правильно сформулировал.
С интерпретацией кода проблем нет.
Есть проблема с занесением в табличную часть операций.
Судя по конфигуратору в документе ТехКарта, как в принципе и в других, которые могут содержать производственные операции, просто нет такой таблицы значений. Такое ощущение, что для 1С производственная операция что-то абстрактное и имеет вес только при проводке Наряда. В коде загрузки формы ТехКарты есть функции добавления различных закладок, где присутствуют производственные операции, но это форма, и код там совсем непростой, особенно для "продвинутого юзера", каковым я являюсь Жаль. Причем когда создаешь техкарту врукопашную, на закладку операии невозможно перейти пока ее не запишешь. Может стоит сначала запустить цикл для материалов, записать, а потом добавить операции???
В любом случае спасибо за ответ Улыбаюсь
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 25-12-2010 09:26 » 

Я не работал с рарусовскими конфигурациями, кроме как Общепит, и то немного - потому подробностей не знаю.
Вполне возможно, что они настроены таким образом, что там возможно ручное редактирование операций, и вполне логично, появятся они только после записи. К сожалению в этом случае только придется разбираться в коде.
Цитата
Может стоит сначала запустить цикл для материалов, записать, а потом добавить операции???
Звучит очень логично - стоит попробовать
Записан
Woodall
Интересующийся

ru
Offline Offline

« Ответ #4 : 25-12-2010 09:59 » 

Тогда, если можно, еще один маленький вопрос:
раз уж их нет в кофигураторе, где можно посмотреть, куда они записываются эти присовокупленные параметры, которые вводятся на дополнительных закладках форм?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 25-12-2010 11:13 » 

Покажите хотя бы скриншот этой "дополнительной закладки"
Записан
Woodall
Интересующийся

ru
Offline Offline

« Ответ #6 : 27-12-2010 05:52 » 

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

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

Иначе Спр.НайтиЭлемент(тзОпераций.Элемент);
КонецЕсли;
Спр.ПроизводственнаяОперация=тзОпераций.ПроизводственнаяОперация;
Спр.Количество=тзОпераций.Количество;
Спр.НеИзмКоличество=?(тзОпераций.НеИзмКоличество=2,1,0);
Спр.Порядок=тзОпераций.Порядок;
Спр.Записать();
Если Спр.ПометкаУдаления()=1 Тогда Спр.СнятьПометкуУдаления(); КонецЕсли;
КонецЦикла;
КонецЕсли;

Добавлено через 18 секунд:
Вроде все хорошо, но моих скудных навыков VBA не хватает, чтобы скрутить вместе документ Технологическая карта и справочник Таблица производственных операций Жаль
Что не так в моем коде?:
Код:
Спр=СоздатьОбъект("Справочник.ТаблицаПроизводственныхОпераций");
СпрОпер=СоздатьОбъект("Справочник.ПроизводственныеОперации");
Для к=НомерЗаписи по БД_Материалы.КоличествоЗаписей() Цикл
Если БД_Материалы.Ключ.CUSTID<>БД.CUSTID Тогда Прервать; КонецЕсли;
Если Число(БД_Материалы.SORT)>5 Тогда //Ругается, что сначала надо установить объект на запись
Спр.Новый();
Спр.Документ=ДокЗадание.НомерДок;
ПрОперация=ПолучитьОперацию(БД_Материалы.MATNAME);
Спр.Количество=БД_Материалы.COUNT;
Спр.ПроизводственнаяОперация=ПрОперация;
Спр.Записать();
КонецЕсли;
БД_Материалы.Следующая();
КонецЦикла;

* scrn1.jpg (71.37 Кб - загружено 998 раз.)
* scrn.jpg (117.69 Кб - загружено 1030 раз.)
« Последнее редактирование: 27-12-2010 09:35 от Woodall » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 27-12-2010 09:38 » 

1. При чем тут VBA в вопросе по 1С?
2. А что есть БД_Материалы?
3. Обрамляй код тегами: [code]Код[/code] и форматируй его отступами
Записан
Woodall
Интересующийся

ru
Offline Offline

« Ответ #8 : 27-12-2010 13:04 » 

1. При чем тут VBA в вопросе по 1С?
Возможно, ни при чем. Просто мои знания программирования сводятся к уровню "чуть-чуть сэкономить свое время", и т.к. до этого я сталкивался только с VBA, тем не менее, приобретенных знаний на форумах и в хелпе, я думаю, достаточно, чтобы не писать в форум "дайте код" или "срочно пАмАгите", а попытаться самому разобраться хотя бы с частью задачи. По большому счету, встроенный язык 1С, по крайней мере у меня, ассоциируется с русофицированным VBA. Возможно, вернее скорее всего, в глобальном плане он и отличается, но мне, как дилетанту, какая-то часть функций и операторов, в принципе понятна, чтобы пробовать что-то сделать самостоятельно, и здесь я задал вопрос, чтобы получить хотябы направление, в котором нужно копать... Ну да ладно, это философия Улыбаюсь
По существу
2. А что есть БД_Материалы?
Импортируемый объект .dbf, в котором содержатся данные о необходимых материалах и работах, ну или XBase, не знаю как правильней
3. Обрамляй код тегами: [code]Код[/code] и форматируй его отступами
Искренне извиняюсь, в следующий раз обязательно, видимо где-то пропустил, читая правила форума.

4. Практически все получилось, по крайней мере работает
кому интересно:
Код:
Спр.Документ=ДокЗадание.НомерДок;
заменил на
Код:
Спр.Документ=ДокЗадание.ТекущийДокумент();

правда на дбф ругается во втором цикле для операций, работа для "напильника" осталась:)

5. Тему можно закрывать, спасибо за участие.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 27-12-2010 13:12 » 

К слову: цикл по DBF обычно строится с использованием EOF(). Возможно просто произошел выход за пределы таблицы.
Если ругается на запись - проверь что ты в ПолучитьОперацию() передаешь значение, а не ссылку (похоже внутри этой функции происходит изменение).
Код:
// Сравни:
Функция ПолучитьОперацию(НаименованиеМатериала)
    НаименованиеМатериала = СокрЛП(НаименованиеМатериала);
КонецФункции
// И
Функция ПолучитьОперацию(Знач НаименованиеМатериала) // Ключевое слово "Знач"
    НаименованиеМатериала = СокрЛП(НаименованиеМатериала);
КонецФункции

В твоем случае нужен второй вариант
Записан
Woodall
Интересующийся

ru
Offline Offline

« Ответ #10 : 28-12-2010 13:31 » 

Цитата
К слову: цикл по DBF обычно строится с использованием EOF(). Возможно просто произошел выход за пределы таблицы.
Именно так оно и было. Перед вторым циклом нужно было перепозиционироваться
Код:
БД_Материлы.Первая()
Не успел найти EOF()=Последняя() и BOF()=Первая()?
А так все работает и не ругается  Улыбаюсь
Ещё раз спасибо Улыбаюсь
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 28-12-2010 15:56 » 

EOF()=Последняя() и BOF()=Первая()?
Не понял вопроса.
EOF() == ВКонце(), Первая() == First()
Цикл выглядит так:
Код:
DBF.First()
Пока DBF.EOF()=0 Цикл
    ...
    DBF.Next();
КонецЦикла;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines