У Вас что-то очень много нестандартных хотелок. Может лучше сделать как в стандартных отчетах реализовано (например Отчет По Партиях товара, или Отчет Продажи). Вверху в сформированном отчете есть кнопки "Оновить" Настроить". Суть тут такая: Сформировали отчет. Потом в каком-то документе поменяли данные, записали документ. Потом просто нажать "Оновить" и отчет перерисуется (с теми же параметрами которые пользователь выбрал для отчета). (сформированный отчет должен быть в Режиме ТолькоПросмотр(1)
ZUBR @ Сегодня, 1:49
, Зрозуміліше не стало від цього пояснення. Пропробую здогадатися. І так і вас на формі обробки (чи де саме використовуєте даний код) є реквізити Имя_, Телефон, АдресаОбласть, АдресаНаселенийПункт, АдресаВулиця. В залежності від нажатої кнопки потрібно зробити три різних пошуки. 1. по реквізиту форми Имя_ 2. по реквізиту форми Телефон 3. одночасно по співпадінню зразу трьох реквізитів АдресаОбласть, АдресаНаселенийПункт, АдресаВулиця Тоді потрібно ось так прописати
Если НомерВызова=1 тогда РеквизитДокумента=Расх.Имя; РеквизитФормы=Имя_; ИначеЕсли НомерВызова=2 тогда РеквизитДокумента=Расх.Телефон; РеквизитФормы=Телефон_; ИначеЕсли НомерВызова=3 тогда РеквизитДокумента=Расх.АдресОбл+Расх.НасПункт+Расх.АдресВул; РеквизитФормы=АдресаОбласть+АдресаНаселенийПункт+АдресаВулиця; КонецЕсли;
Если ((Найти(РеквизитДокумента,РеквизитФормы)>0)и(Расх.ПометкаУдаления()=0)) Тогда // замінити замість Вашої умови // РеквизитДокумента, РеквизитФормы придумані довільні // відповідно у Вашому докумеенті РасходнаяНакладная повинні бути ці реквізити (або вони називаються по іншому) Телефон, Имя, АдресОбл, НасПункт , АдресВул // або можливо це реквізити контрагента який є на формі документа. Поді відповідно буде Расх.Контрагент.АдресОбл , .......... // можливо для рексвізитів в даному коді потрібно буде застосувати СокрЛП
Или, хотя бы, как сделать так, чтобы таблица значений и другие созданные объекты в одной процедуре, были видны в других процедурах?
Це робиться досить просто. в самому верху модуля (до всіх процедур) робиться обявлення всіх реквізитів які повинні бути доступні у всіх процедурах і функціях даного модуля:
Я так зрозумів, що ця процедура визивається різними кнопками. Тому щоби знати якою кнопкою визвана процедура на кожній кнопці визиваємо приблизно так:
ПоискПТФ(1) -на першій кнопці ПоискПТФ(2) - на другій кнопці ......
В самому модулі навзву процедури пишемо так;
ПоискПТФ(НомерВызова)
І в тексті процедури, перед Вашою умовою пишем
Если НомерВызова=1 тогда РеквизитСправочника=Расх.Имя; РеквизитФормы=Имя_; ИначеЕсли НомерВызова=2 тогда РеквизитСправочника=Расх.Телефон; РеквизитФормы=Телефон_; Иначе.............. .......... КонецЕсли;
Если ((Найти(РеквизитСправочника,РеквизитФорми)>0)и(Расх.ПометкаУдаления()=0)) Тогда // замінити замість Вашої умови
Sharzem @ Сегодня, 9:59
, Спеціально для мене заморочились? Звичайно це набагато краще. (оптимізовувати код можна до бескінечності). але і буковок набагато більше писати потрібно було,
Вставлю и свои 5 копеек. Я так проверяю в табличной части документа на дубли контрагентов. Легко можно переделать на проверку на дубли в таблице значений или списке значений. Тут отработает быстрее чем цикл в цикле
сз=СоздатьОбъект("СписокЗначений"); ВыбратьСтроки(); Пока ПолучитьСтроку()=1 Цикл зн=Контрагент.Код; поз=сз.НайтиЗначение(зн); Если поз<>0 Тогда СтараСтрічка=""; тмп=сз.ПолучитьЗначение(поз,СтараСтрічка); сообщить("Однаковий Контрагент: "+Контрагент+" в рядках: "+СтараСтрічка+" і "+НомерСтроки,"!"); КонецЕсли; сз.ДобавитьЗначение(зн,""+НомерСтроки); КонецЦикла;
Добре, По тій схемі як Ви написали не спрацює. Потрібно через так зване "Ложное открытие" . В мене так працює груповий друк документу. Отже 1. в журналі де йде створення документу написати:
СЗ=СоздатьОбъект("СписокЗначений"); СЗ.Установить("ВыполнитьПечать",1); // змінну можете назвати так як забажаєте ОткрытьФорму(Док,СЗ);
2. В самому документі в ПриОткрітии() в самому цінці процедури;
_Параметр=Форма.Параметр; Если ТипЗначенияСтр(_Параметр)="СписокЗначений" Тогда Если _Параметр.Получить("ВыполнитьПечать")=1 Тогда // Печать1(1,1); //Записать(); Провести();; // по вкусу добавити СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли;
А зачем вообще открывать форму документа, если програмно создается документ и програмно записываются все нужные реквизиты в нем?4andriy @ Вчера, 22:11
,
Невелике пояснення до відповіді denis84. Чому використовується СокрЛП. Тому, що для текстового поля, його значення завжди займає всі символи відведені для нього. Якшо вказали наприклад 100 символів, то незалежно від того скільки заповнили, строка для 1С буже виглядати так (наприклад Адреса: "м. Київ, вул Банківська __________________________ " - тобто допониться пробілами до 100 символів)
П.с., не по темі. Бачу ви всі повідомлення пишети вночі, А спите коли, вдень? При такій великій нагрузці можна скоро "вигоріти" на роботі
Функция "Найти" возвращает позицию первого вхождения в строку поиска заданной подстроки.
Если не находит - возвращает число 0. Если находит то возвращает номер первого найденного символа (это может быть как 1 так и 2 и 7 и 25...., а не всегда 1 как вы написали)
Як я зрозумів, потрібно при різних наборах прав керувати видимістю деяких реквізитів на формі. В доному випадку небачу красивого рішення. Можу запропонувати два варіанти 1. Аналізувати яка закладка відкрита. І якщо відкрита закладка де є Ваш реквізит тільки тоді керувати її видимістю (назва закладки знаходиться в реквізиті Значение). 2. Замість керувати видимістю, керуйте Доступністю реквізитів (реквізит буде видно на формі, але небуде доступний для натискання/вибору). В даному випадку вже непотрібно аналізувати яка закладка відкрита.
Спасибо, про объединение конфигураций почитаю, я так понимаю это что-то вроде обработки, которая сравнит одну конфигурацию с другой и даст возможность добавить отличия одной в другую.Если не затруднит, где почитать? Заранее спасибо!
Это внутренняя обработка (внутри конфигурации). В конфигураторе в меню выбрать Конфигурация- Обеденение конфигураций... Откроется меню для вибора файло из которого хотите загрузить конфигурацию. Виберете файл 1cv7.md из своей копии где делали изменения. Система промнализирует различия между двумя конфигурациями и покажет различия. Потом просто нажать обеденить (все отметки оставить по умолчанию)
1. Чтото сильно намудрили с этими документами..... я до конца так и не понял. Поясню так как понял. 2. В документе акт нужно создать реквизит (СсылкаНаДокументРасхНакл) с типом Документ.РасходнаяНакладная 3. в документе Акт после Расх.Записать(); Написать СсылкаНаДокументРасхНакл=Расх.ТекущийДокумент():- это будет ссылка в Акте на ваш созданный документ расх накуладной. 4. Для ссылки На акт из расходной накладной; Расх.СсылкаНаАктПриема = ТекущийДокумент(); (соответственно реквизит в расходной накладной должен быть типа Документ.АктПрийома). 5. Ссылка на документ Расходная накладная, возможна только после его записи (после строки Расх.Записать(). Соответственно и обратное, передавать ссылку на документ Акт в расходную накладную нужно после записи акта (написать Записать(); перед передачей ссылки на акт)
Ну так в документе у вас уже все готовое есть просто нужно посмотреть как реализовано. 1. Переключение закладок : Процедура ПриВыбореЗакладки(Номер,Значение) 2. Установка закладок в ПриОткрытии уснанавливается визуальное отображение закладок Форма.ИспользоватьЗакладки(1);
1. На двух компах разные принтера, наверное потому на одном влазит, а на другом нет. 2. В макете печатной формы в подвале есть пустые строки - в них ничего не выводится, но они участвуют в формировании печатной формы. 3. Может быть в макете печатной формы ниже подвала еще пунктирная линия разделения страниц. тогда эти строки в макете тоже нужно удалить. 4. свой вариант
ZUBR @ Вчера, 17:31
, і чим він не подобається. Це звичайне рішення, в багатьох місцях його використовують. Для користувача взагалі ніяких відмінностей небуде.
інший вихід- таблицю значень помістити прямо на форму
ZUBR @ Вчера, 21:26 * , Пришел к выводу, что ошибки нет, просто, когда запускается процедура не с кнопки, а с поля ввода, программа ищет таблицу в виде файла. И не находит. Можно ли обойти эту проблему?
Для виклику друку із поля вводу потрібно робити через Ложное закрытие. Здається я вже Вам раз давав як виглядає це ложне закриття. Нагадаю:
Процедура ПечатьИзПоляВвода() // цю процедуру вішаємо на поле вводу МожноЗакрыть = 0; Форма.Закрыть(0); КонецПроцедуры
Процедура ПриЗакрытии() Если МожноЗакрыть = 0 Тогда МожноЗакрыть = 1; Сформувати(); // ця процедура, яку потрібно виконатити СтатусВозврата(0); // відмінити закриття форми Возврат; // протрібно якщо нижче в цій процедурі є ще якийсь код, і не потрібно щоб він виконувався КонецЕсли; КонецПроцедуры
Якшо у вас на цій формі вже використовується ложне закриття для інших цілей, то використовуйте разні значення для змінної МожноЗакрыть для різних цілей, і в ПриЗакритии просто аналізуючи яке його значення виконувати потрібні дії
ZUBR @ Вчера, 23:00
, Наскільки я зрозумів в довіднику Номенклатура реквізит КЗП записується тільки вручну. Ніякими документами він не міняється і небуде мінятись документами. Тоді процес спрощується, Але роботи всеодно буде потрібно багато. 1. В довіднику поставити признак ПеріодичнийРеквізит. ИзменениеДокументом не ставити. 2. Зберегти конфігурацію і зайти в Предприятие. Перше значення періодичного реквізита повинно встановитись автоматично на дату наприклад 1 січня 1980 року. Це добре. (перевірити: права кнопка на номенклатурі-> Історія реквізиту). Якщо так поставилсь тоді все добре. 3. В довіднику контрагенти в процедурі ПриОткрытии прописати це (якщо його там немає);
СохранениеПериодическихРеквизитов(2, "*"); ИспользоватьДату(ТекущаяДата()); // періодичні реквізити будут завжди записуватись на сьогодні //або ИспользоватьДату(РабочаяДата());// періодичні реквізити будуть записуватись на робочу дату (робочу дату можна міняти в (сервіс-Параметри-Общие)
При цьому 1С небуде задавати додаткових питань на яку дату записувати реквізити. 4. Тут саме цікаве. Всюди (в документах, в звітах, в макетах (печатних формах)), де використовується ваш реквізит КЗП потрібно замінити Наприклад :
знач=Спр.КЗП: // було так знач=Спр.КЗП.Получить(НужнаяДата): // змініти на це
1. що означає відмітка "Изменяется документами"- Це означає що значення періодичного реквізиту справочника можна міняти тільки документом (в ОбработкаПроведения() ). Коди документ помічається на видалення або робиться непроведеним, то автоматично значення цього реквізиту пропадає (яке привязане до даного документа) 2. Якшо ще поставити "Ручне Изменение" тоді значення періодичного реквізиту можна міняти з любого місця прогами. Але при видаленні документа воно автоматично не пропаде. Для установки значення документом слід писати так:
УстановитьРеквизитСправочника(Спр.ТекущийЭлемент(),"НазваниеПереодическогоРеквизита","Запишем тут значение реквизита",ДатаДок);
Для ручного встановлення значення потрібно писати:
Для Установить і УстановитьРеквизитСправочника Записывать справочник непотрібно (якщо міняються тільки періодичні реквізити).
Думаю щось пояснив, або ще більше запутав. Якщо є питання, то задавайте конкретніше
Ще забув добавити. При Відмітці "ручне Изменение"в межах дня може бути тільки одне значення періодичного реквізита. Якщо їх буде декілька, то збрежеться те яке останнім змінювалось. При "изменениеДокументом" на кожен документ буде своє значення періодичного реквізиту (хоч 100500 значень в межах одного дня) . Для отримання значення такого реквізитуможна використовувати не дату, а позицію документу ЗначениеРеквизитаНадату=Спр.ТекущийЭлемент().ПерРеквизит.Получить(ТекДокумент)
Але є один недолік в періодичних реквізитів. Абсолютно всі періодичні реквізити всіх справочников зберігаються в одній таблиці. І якщо їх буде дуже багато, то ця таблиця дуже швидко розростеться. І ще з цього випливає, що доступ до періодичних реквізитів буде повільнішим, так як фізично 1С повинна опрацювати дві таблиці (таблицю справочника, і таблицю періодичних реквізитів- це два різних файли на диску)
4andriy @ Вчера, 23:49
, Я так понял эта процедура выполняется в Справочнике.Склыды? Если так, это неверно
Элемент.найтиЭлемент(ТекущийЭлемент());
Потому что ТекущийЭлемет у вас Склады, а пытаетесь найти в справочнике Сотрудники. Нудно так:
Элемент.найтиЭлемент(Отв); Элемент.Должность="склад 1";// если Должность это строка Элемент.Должность=ТекущийЭлемент(); //Если должность это спрвочник.Склады
Хотя мне непонятно зачем вы переменной Должность присваиваете значение склада
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!