На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:

  • Перед тем, как задать вопрос, желательно почитать документацию и воспользоваться поиском.
  • Когда задаёте вопрос, то обязательно указывайте платформу (7.7, 8.0, 8.1, 8.2, etc), причем желательно в заголовке. Если речь идёт о типовой конфигурации, то указывайте её название и релиз. Текущие версии можно посмотреть здесь.
  • Ещё раз напоминаем о необходимости соблюдать не только правила, но и законы. Уважайте авторские права.

Высказать своё мнение о модераторах раздела можно здесь: evGenius
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Оригинальные решения v7/v8 , Флейм, наверное, но по теме
    Может складывать сюда те решения, которые вам помогли/понравились... ? а-ля каталог НСР (нестандартные решения)


    Вчера, лазя по 1C.proclub.ru ...

    1. Самомодифицирующийся код для 1Сv7.
    Форма документа:
    ExpandedWrap disabled
      Процедура ПоКнПровести()
          тРегистр = СокрЛП(РегистрДвиж); //текстовое представление регистра движения
          спсПарам = СоздатьОбъект("СписокЗначений");
          спсЗнИзм = СоздатьОбъект("СписокЗначений");
          спсЗнРес = СоздатьОбъект("СписокЗначений");
          
          тблИзм.Выгрузить(спсЗнИзм,,,"Значение");
          тблРес.Выгрузить(спсЗнРес,,,"Значение");
          спсПарам.ДобавитьЗначение(спсЗнИзм,"Измерения");
          спсПарам.ДобавитьЗначение(спсЗнРес,"Ресурсы");
          
          //формирование обработки проведения
          ТекстСкрипта = СоздатьОбъект("Текст");
          ТекстСкрипта.ДобавитьСтроку("//_____________________________________________________________________________
          |Процедура ОбработкаПроведения()");
          Если спсРег.РазмерСписка()>0 Тогда
              //запишем таблицы измерений и ресурсов, чтобы потом взять оттуда значения (можно конечно и списками это сделать)
              ТекстСкрипта.ДобавитьСтроку("тблИзм = ЗначениеИзСтроки(ТаблицаИзмерений);
              |тблРес = ЗначениеИзСтроки(ТаблицаРесурсов);
              |Если (ТипЗначенияСтр(тблИзм)<>""ТаблицаЗначений"") или (ТипЗначенияСтр(тблРес)<>""ТаблицаЗначений"") Тогда
              |   Сообщить(""Неверное значение таблицы Измерений или Ресурсов!"");
              |   СтатусВозврата(0);
              |   Возврат;
              |Иначе
              |   Если (тблИзм.КоличествоСтрок()=0) или (тблРес.КоличествоСтрок()=0) Тогда
              |       Сообщить(""Возможно у выбранного регистра нет измерений или ресурсов!"");
              |   КонецЕсли;
              |КонецЕсли;");
              тблИзм.ВыбратьСтроки();
              //заполнение значений измерений
              Пока тблИзм.ПолучитьСтроку()=1 Цикл
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+"."+СокрЛП(тблИзм.Измерение)+" = тблИзм.ПолучитьЗначение("+тблИзм.НомерСтроки+",""Значение"");");
              КонецЦикла;
              тблРес.ВыбратьСтроки();
              //заполнение значений ресурсов
              Пока тблРес.ПолучитьСтроку()=1 Цикл
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+"."+СокрЛП(тблРес.Ресурс)+" =  тблРес.ПолучитьЗначение("+тблРес.НомерСтроки+",""Значение"");");
              КонецЦикла;
              Если ВидДвиж=1 Тогда
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+".ДвижениеПриходВыполнить();");
              Иначе
                  ТекстСкрипта.ДобавитьСтроку(тРегистр+".ДвижениеРасходВыполнить();");
              КонецЕсли;
          КонецЕсли;
          ТекстСкрипта.ДобавитьСтроку("КонецПроцедуры //ОбработкаПроведения
          |//_____________________________________________________________________________
          |Процедура ОбработкаУдаленияПроведения()
          |КонецПроцедуры //ОбработкаУдаленияПроведения");
          
          ТекстСкрипта.Записать(КаталогИБ()+"make.txt");
          Провести();
          //ФС.УдалитьФайл(КаталогИБ()+"make.txt");
          Форма.Закрыть();
          //если убрать следующий ниже комментарий,
          //то при отмене проведения документа будет ругаться: "Не могу открыть файл: make.txt"
          
          //ФС.УдалитьФайл(КаталогИБ()+"make.txt");
      КонецПроцедуры //ПоКнПровести

    И в модуле написано #ЗагрузитьИзФайла make.txt

    Вроде просто, но я бы до такого не додумалась...

    2. Несколько табличных частей для 1Сv7
    В шапке добавляется строковый реквизит неограниченной длины.
    На форму вешается ТЗ.
    При открытии формы пишется (пока на пробовала, но идея такова...) ТЗ = ЗначениеИзСтроки( <имя реквизита> );
    Работа с ТЗ описывается, ессно, самостоятельно...
    То же можно делать и для справочников
      Цитата

      В шапке добавляется строковый реквизит неограниченной длины


      Этого делать не советуеться... если перевети базу с DBF на SQL, то возможны проблемы в работоспособности, а именно критеская ошибка...я уже с этим не однократно сталкивался...
        значит так:
        есть документы, у них есть общие реквизиты, допустим "Автор", вот как раз то этот реквизит и был определен со стракой не определенного размера. и при открытии документа 1С'ка падала целиком, говорила что мол в приложении была допушина кретическая ошибка, приложение будет закрыто. и все, хоть ты трести...но это только в конфигурациях на базе SQL Server 2000.. , проблема решаеться элементарно, определяешь реквизит "Автор" строкой размера: 255, и все!

        Удачи!
          Цитата maxim84_ @
          ..но это только в конфигурациях на базе SQL Server 2000..

          Спасибо! Просто у меня SQL 7.0, и таких граблей я ещё не встречал. Это только для общих реквизитов, или вообще в любом реквизите шапки?
          Бо я ща как раз тулю таблицы в такой рекв-т, и 255 симвов там не хватит по-любому, а вдруг придется на 2000й SQL перебираться с этой конфой..
            Вот сегодня увеличил размерность до 510 - работает. видимо такая реакция наблюдаеться только при не определенном размере.
            Вот какой реквизит именно, я не в курсе, у меня такая трабла была только с общим реквизитом.
              Обсуждение глюка предагаю продолжить в Что-то вроде bug report, бо тут, типа оффтоп.. А в качестве извинения предлагаю новинку:
              Новинка! В помощь работодателю.
              Данный диалог призван отделить выдующихся пользователей от безнадёжных при приёме на работу оператора "со знанием 1С"... ;)
              user posted image
              Важно наблюдать за изменениями выражения лица испытуемого по мере углубления в суть вопроса.
              Имхо, забавно.. :unsure:
                V8
                ExpandedWrap disabled
                  Function Excel2ValueTable(FileName,LeftOffSet = 1,TopOffSet = 3) export
                      Excel = new ComObject("Excel.Application");
                      Data = Excel.workbooks.Open(FileName).Sheets(1);
                      Status("Excel Opened");
                      //ishem porvuju stroku
                      i=TopOffSet;
                      Text="";
                      cRow = data.Rows(i);
                      while EmptyValue(cRow.cells(LeftOffSet).value) do
                          i=i+1;
                          cRow = data.Rows(i);
                      enddo;
                      ValueTable = new ТаблицаЗначений;
                      Row = i;
                      cRow = data.Rows(Row);
                      i=0;
                      while Not EmptyValue(cRow.cells(LeftOffSet+i).value) do
                          ValueTable.columns.Add("Column"+i,,cRow.cells(LeftOffSet+i).value);
                          i =i+ 1;
                      enddo;
                      //pervaja stroka dannyh
                      Row = Row+1;
                      cRow = data.Rows(Row);
                      //idem vniz do pustoj stroki
                      while Not EmptyValue(cRow.cells(LeftOffSet).value) do
                          Status("Processing row: "+Row);
                          NewRow = ValueTable.Добавить();
                          for each Column in ValueTable.Колонки do
                              ColNum = ValueTable.Колонки.Индекс(Column);
                              RealColNum = ColNum+LeftOffSet;
                              Value = cRow.cells(RealColNum).value;
                              NewRow.Установить(ColNum,Value);
                          enddo;//po kolonkam excela
                          Row = Row+1;
                          cRow = data.Rows(Row);
                      enddo;  //Po Strokam excela
                      Excel.ActiveWorkbook.Close(False);
                      Excel.Quit();
                      return ValueTable;
                  endFunction
                  Обработка "Быстрый запуск" для 1Сv7.
                  Есть возможность при запуске 1С показывать маленькую паннельку, на которую можно добавлять
                  а) Вызов внутренних отчетов
                  б) Ввод документов
                  в) Вызов внешних отчетов
                  Возможность автозагрузки выбранных отчетов (так же требует доработки модулей отчетов).

                  Как доп. возможность (сделала по просьбе "своего" бухгалтера) - сохранение последних
                  открытых таблиц (правда это требует ручного добавления в КАЖДУЮ необходимую точку показа
                  таблицы одной/двух строк.)

                  Сам файл обработки, иконки и текст глобального модуля прилагаются.

                  Для блокировки кнопки закрытия и изменения размеров списка при масштабировании
                  используется компонента FormEx.

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

                  Приложенный файл переименовать в ЕХЕ
                  Сообщение отредактировано: Волченка -

                  Прикреплённый файлПрикреплённый файлMine._QL.SFX (59.27 Кбайт, скачиваний: 1540)
                    Условие в запросе по значению периодического реквизита на произвольную дату.
                    (с)YAZZ

                    ВыбДата и ВыбПодр - либо реквизиты формы, либо ранее определенные значения
                    Запрос выбирает сотрудников, который на заданную дату относились к
                    заданному подразделению.

                    ExpandedWrap disabled
                      Функция ПолучитьПодразделение(ВП);
                        Подр = ВП.Подразделение.Получить(ВыбДата);
                        Если Подр=ВыбПодр Тогда
                          Возврат 1;
                        Иначе
                          Возврат 0;
                        КонецЕсли;
                      КонецФункции
                       
                      Запрос:
                      Запрос = СоздатьОбъект("Запрос");
                                  ТекстЗапроса =
                                  "//{{ЗАПРОС(ВывестиСписок)
                                  |Обрабатывать НеПомеченныеНаУдаление;
                                  |Без итогов;
                                  |Сотр = Справочник.Сотрудники.ТекущийЭлемент;
                                  |ТБ = Справочник.Сотрудники.Код;
                                  |ФИО = Справочник.Сотрудники.Наименование;
                                  |Подр = Справочник.Сотрудники.Подразделение.Наименование;
                                  |Кат = Справочник.Сотрудники.КатегорияПлательщикаПФР;
                                  |ДР = Справочник.Сотрудники.ДатаРождения;
                                  |Группировка ТБ без групп все ВошедшиеВЗапрос;
                                  |Группировка ФИО без групп все;
                                  |Условие(ПолучитьПодразделение(Сотр) = 1);
                                  |";
                      Как обойти перекрытие процедур глобального модуля
                      Наверняка иногда приходилось сожалеть о том, что предопределенные процедуры в модуле формы отчета / обработки перекрывают аналогичные из глобального модуля.
                      Например, в таблице есть стандартные расшифровки для запуска отчетов стандартным списком в расшифровке ячейки таблицы, который обрабатывается в процедуре ОбработкаЯчейкиТаблицы() глобального модуля (типа кноп "Обновить","Настройка" в стандартных бух. отчетах), и есть расшифровки, обработчики которых не хочется совать в глобальный модуль (например, внешний отчет).
                      На самом деле всё лечится очень даже просто. Почему сюда запостил, так это потому, что в имеющихся конфах подобного не нашел, значит - оригинально. :whistle: Суть метода - заглушка-прокси для процедуры в глобальном модуле:

                      ExpandedWrap disabled
                        //В примере есть в таблице кнопа "Перепровести все", у которой в расшифровке сидит строка "#Провести"
                        //<-------- Глобальный модуль ---------->
                        Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт
                            //Стандартный обработчик, который так хочется вызвать
                            //...
                        КонецПроцедуры //ОбработкаЯчейкиТаблицы
                         
                        Процедура глОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт
                            //Стаб-прокси, который нужен для "разименования" стандартной процедуры
                            ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица);
                        КонецПроцедуры //глОбработкаЯчейкиТаблицы
                         
                         
                        //<-------- Модуль формы отчета ---------->
                        Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица)
                            Если Расшифровка = "#Провести" тогда
                                СтандартнаяОбработка=0;
                                ПровестиВсеДоки(Таблица);
                            Иначе
                                //Call global one with proxy
                                глОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица);
                            КонецЕсли;
                        КонецПроцедуры //ОбработкаЯчейкиТаблицы

                      Просто, но работает :yes:
                      Сообщение отредактировано: Mechanic -
                          v7. Транслит. Может кому понадобится.
                          ExpandedWrap disabled
                            Функция Транслит(Стр) Экспорт
                                Исх = СоздатьОбъект("СписокЗначений");
                                Кон = СоздатьОбъект("СписокЗначений");
                                Исх.ДобавитьЗначение("а");Кон.ДобавитьЗначение("a");
                                Исх.ДобавитьЗначение("б");Кон.ДобавитьЗначение("b");
                                Исх.ДобавитьЗначение("в");Кон.ДобавитьЗначение("v");
                                Исх.ДобавитьЗначение("г");Кон.ДобавитьЗначение("g");
                                Исх.ДобавитьЗначение("д");Кон.ДобавитьЗначение("d");
                                Исх.ДобавитьЗначение("е");Кон.ДобавитьЗначение("e");
                                Исх.ДобавитьЗначение("ж");Кон.ДобавитьЗначение("j");
                                Исх.ДобавитьЗначение("з");Кон.ДобавитьЗначение("z");
                                Исх.ДобавитьЗначение("и");Кон.ДобавитьЗначение("i");
                                Исх.ДобавитьЗначение("й");Кон.ДобавитьЗначение("i");
                                Исх.ДобавитьЗначение("к");Кон.ДобавитьЗначение("k");
                                Исх.ДобавитьЗначение("л");Кон.ДобавитьЗначение("l");
                                Исх.ДобавитьЗначение("м");Кон.ДобавитьЗначение("m");
                                Исх.ДобавитьЗначение("н");Кон.ДобавитьЗначение("n");
                                Исх.ДобавитьЗначение("о");Кон.ДобавитьЗначение("o");
                                Исх.ДобавитьЗначение("п");Кон.ДобавитьЗначение("p");
                                Исх.ДобавитьЗначение("р");Кон.ДобавитьЗначение("r");
                                Исх.ДобавитьЗначение("с");Кон.ДобавитьЗначение("s");
                                Исх.ДобавитьЗначение("т");Кон.ДобавитьЗначение("t");
                                Исх.ДобавитьЗначение("у");Кон.ДобавитьЗначение("u");
                                Исх.ДобавитьЗначение("ф");Кон.ДобавитьЗначение("f");
                                Исх.ДобавитьЗначение("х");Кон.ДобавитьЗначение("x");
                                Исх.ДобавитьЗначение("ц");Кон.ДобавитьЗначение("c");
                                Исх.ДобавитьЗначение("ч");Кон.ДобавитьЗначение("ch");
                                Исх.ДобавитьЗначение("ш");Кон.ДобавитьЗначение("sh");
                                Исх.ДобавитьЗначение("щ");Кон.ДобавитьЗначение("sch");
                                Исх.ДобавитьЗначение("ъ");Кон.ДобавитьЗначение("'");
                                Исх.ДобавитьЗначение("ы");Кон.ДобавитьЗначение("y");
                                Исх.ДобавитьЗначение("ь");Кон.ДобавитьЗначение("'");
                                Исх.ДобавитьЗначение("э");Кон.ДобавитьЗначение("e");
                                Исх.ДобавитьЗначение("ю");Кон.ДобавитьЗначение("yu");
                                Исх.ДобавитьЗначение("я");Кон.ДобавитьЗначение("ya");
                                
                                Стр1 = Стр;
                                Для Инд=1 По Исх.РазмерСписка() Цикл
                                    Истр = Исх.ПолучитьЗначение(Инд);
                                    Кстр = Кон.ПолучитьЗначение(Инд);
                                    Стр1 = СтрЗаменить(Стр1,Истр,Кстр);
                                    Стр1 = СтрЗаменить(Стр1,Врег(Истр),Врег(Лев(Кстр,1))+?(СтрДлина(Кстр)=1,"",Сред(Кстр,2,СтрДлина(Кстр))));
                                КонецЦикла;
                                
                                Возврат Стр1;
                            КонецФункции
                            КонецФункции
                          Сообщение отредактировано: Волченка -
                            Цитата Волченка @
                            Стр1 = СтрЗаменить(Стр1,Врег(Исх.ПолучитьЗначение(Инд)),Врег(Кон.ПолучитьЗначение(Инд)));

                            Глючок-с. Щетка -> SCHetka, а надо Schetka.

                            /*сорри что правлю... просто чтобы новые посты не плодить. Глюк поняла, исправлю. Ja*/
                            /*Через 10 минут: подправила. работает. С чем еще глюк? Ja*/
                            Сообщение отредактировано: Волченка -
                              Прямой доступ к данным DBF и SQL.
                              Ссылка №1
                              Цитата
                              Прямой доступ к данным (в контексте dbf) подразумевает использование провайдера фирмы Microsoft: VFP OLE DB povider v9. Провайдер абсолютно бесплатен.

                              Ссылка №2
                              Цитата
                              FAQ по прямым запросам. Причем как в SQL, так и в DBF
                                ExpandedWrap disabled
                                  // Делал сам:
                                  // {{{                      
                                  // Функции работы с датой
                                  // Удобны например для получения разницы в днях между датами, получения дня от начала года/стролетия и т.д.
                                  // Вход:
                                  //   Дат - Дата
                                  // Выход: Порядковый номер дня от начала года
                                  Функция глПолучитьДеньГода(Дат) Экспорт
                                      ДеньГода = 0;
                                      Для Н = 1 По ДатаМесяц(Дат)-1 Цикл
                                          ДеньГода = ДеньГода+ДатаЧисло(КонМесяца(Дата(ДатаГод(Дат),Н,1)));
                                      КонецЦикла;                                                          
                                      Возврат ДеньГода+ДатаЧисло(Дат);
                                  КонецФункции
                                   
                                  // Вход:
                                  //   Дат - Дата
                                  // Выход: Порядковый номер дня от начала столетия
                                  Функция глПолучитьДеньСтолетия(Дат) Экспорт
                                      ДеньСтолетия = 0;
                                      Для Н = 1900 По ДатаГод(Дат)-1 Цикл
                                          ДеньСтолетия = ДеньСтолетия+глПолучитьДеньГода(Дата(Н,12,31));
                                      КонецЦикла;
                                      Возврат ДеньСтолетия+глПолучитьДеньГода(Дат);
                                  КонецФункции      
                                   
                                  // Вход:
                                  //   Год - Год по которому нужно получить дату от его начала
                                  //  День - День от начала года "Год" по которому нужно получить дату
                                  // Выход: Дата дня "День" от начала года "Год
                                  Функция глПолучитьДатуПоДнюГода(Год,День) Экспорт
                                      ДеньГода = 0;
                                      Для Н = 1 По 12 Цикл
                                          ДеньГода = ДеньГода+ДатаЧисло(КонМесяца(Дата(Год,Н,1)));  
                                          Если ДеньГода >= День Тогда      
                                              Чис = День-глПолучитьДеньГода(Дата(Год,Н,1))+1;
                                              Возврат Дата(Год,Н,Чис);
                                          КонецЕсли;
                                      КонецЦикла;      
                                      Возврат Дата(Год,12,День-глПолучитьДеньГода(Дата(Год,12,1))+1);
                                  КонецФункции
                                   
                                  // Вход:
                                  //   День - Порядковый номер дня от начала столетия
                                  // Выход: Дата этого дня
                                  Функция глПолучитьДатуПоДнюСтолетия(День) Экспорт
                                      ДеньСтолетия = 0;
                                      ПД = Цел(День/365);      
                                      
                                      Для Н = 1900 По 1900+ПД Цикл
                                          ДеньСтолетия = ДеньСтолетия+глПолучитьДеньГода(Дата(Н,12,31));
                                          Если ДеньСтолетия >= День Тогда    
                                              Возврат глПолучитьДатуПоДнюГода(Н,День-глПолучитьДеньСтолетия(Дата(Н,1,1))+1);
                                          КонецЕсли;
                                      КонецЦикла;                                              
                                      Возврат глПолучитьДатуПоДнюГода(ПД,День-глПолучитьДеньСтолетия(Дата(ПД,1,1))+1);
                                  КонецФункции    
                                   
                                  // Вход:
                                  //   Дат - Дата к которой нужно добавить/убавить дней
                                  // КоличествоДней - Количество дней которое нужно прибавить
                                  // Выход: Дата получаемая путём прибавления/убавления к дате "Дат" числа дней "КоличествоДней"
                                  Функция глДобавитьДнейКДате(Дат,КоличествоДней) Экспорт
                                      ДеньСтолетия=глПолучитьДеньСтолетия(Дат);
                                      Возврат глПолучитьДатуПоДнюСтолетия(ДеньСтолетия+КоличествоДней);
                                  КонецФункции
                                   
                                   
                                  // }}}
                                Сообщение отредактировано: RusUdin -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0538 ]   [ 15 queries used ]   [ Generated: 19.03.24, 10:58 GMT ]