Архив за месяц: Ноябрь 2014

1с 8.1: Как программно открыть множественный подбор документов (справочников)?

Делаем обработку на примере подбора документа Перемещение товаров.

Создаем обработку. На панели размещаем кнопку Подбор




  
Процедура КоманднаяПанель2Подбор(Кнопка)
    ФормаВыбора = Документы.ПеремещениеТоваров.ПолучитьФормуВыбора(,ЭтаФорма);
    ФормаВыбора.МножественныйВыбор = Истина;
    Если Не ФормаВыбора.Открыта() Тогда
        ФормаВыбора.Открыть();
    КонецЕсли;   
   
КонецПроцедуры

 
 
Процедура обработки подбора
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
МассивВыбранныхЭлементов = ЗначениеВыбора;
Для каждого СтрокаМассива Из МассивВыбранныхЭлементов Цикл
Результат = ТабличнаяЧасть1.Найти(СтрокаМассива,"ПеремещениеТоваров");
Если Результат = Неопределено Тогда
НоваяСтрока = ТабличнаяЧасть1.Добавить();
НоваяСтрока.ПеремещениеТоваров = СтрокаМассива;

КонецЕсли;

КонецЦикла; 

 
ФормаВыбора.Открыть();
КонецПроцедуры
 

 
признак множественного подбора предполагает подбор нескольких позиций в журнале,используя зажаты SHIFT или CTRL.

 
.Команда ФормаВыбора.Открыть();  
использованная в конце последней процедуры, позволяет повторно открыть форму подбора. Конечно, при таком способе журнал будет постоянно закрываться и открываться (будет заметно мигание), но это позволяет несложным способом настроить подбор.

1с 8.1: Как программно открыть множественный подбор документов (справочников)?

Делаем обработку на примере подбора документа Перемещение товаров.

Создаем обработку. На панели размещаем кнопку Подбор




  
Процедура КоманднаяПанель2Подбор(Кнопка)
    ФормаВыбора = Документы.ПеремещениеТоваров.ПолучитьФормуВыбора(,ЭтаФорма);
    ФормаВыбора.МножественныйВыбор = Истина;
    Если Не ФормаВыбора.Открыта() Тогда
        ФормаВыбора.Открыть();
    КонецЕсли;   
   
КонецПроцедуры

 
 
Процедура обработки подбора
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
МассивВыбранныхЭлементов = ЗначениеВыбора;
Для каждого СтрокаМассива Из МассивВыбранныхЭлементов Цикл
Результат = ТабличнаяЧасть1.Найти(СтрокаМассива,"ПеремещениеТоваров");
Если Результат = Неопределено Тогда
НоваяСтрока = ТабличнаяЧасть1.Добавить();
НоваяСтрока.ПеремещениеТоваров = СтрокаМассива;

КонецЕсли;

КонецЦикла; 

 
ФормаВыбора.Открыть();
КонецПроцедуры
 

 
признак множественного подбора предполагает подбор нескольких позиций в журнале,используя зажаты SHIFT или CTRL.

 
.Команда ФормаВыбора.Открыть();  
использованная в конце последней процедуры, позволяет повторно открыть форму подбора. Конечно, при таком способе журнал будет постоянно закрываться и открываться (будет заметно мигание), но это позволяет несложным способом настроить подбор.

Ветки (Branch) и слияния (Merge) в TFS


Большинство современных средств для совместного владения кодом поддерживают технологии веток и слияний. Сегодня я немного расскажу об этой штуке в TFS и покажу, как мы ее используем.
Поехали...

Механизм создания веток позволяет некоторую папку в хранилище кода скопировать в другую папку хранилища как есть. Т.е. на момент создания ветки (branch) мы получим две папки абсолютно идентичные друг-другу и отличающиеся только названием. Для создания ветки, достаточно на любой папке открыть контекстное меню  и выбрать:
Ветки всегда создаются на сервере, т.е. после выбора этого пункта и ввода имени папки в которую необходимо делать ветку, на сервере TFS будет произведено копирование всех файлов с папки источника в папку приемник. Кстати, TFS запоминает все такие ветки и даже может их визуализировать. Первая картинка к этой статье, как раз показывает ветки одного из наших проектов. Правда визуализация немного хромает, если преобразовать ветку в папку. Но об этом в другой раз.
Зачем могут быть нужны две папки с абсолютно одинаковым содержимым? На самом деле, все просто. Вы можете сколько угодно изголяться над одной из веток и потом просто ее удалить. Во второй ветке у вас останется исходный код. Согласитесь неплохой способ проводить эксперименты. Еще одна замечательная возможность предоставляемая TFS заключается в слиянии (merge) веток. Если две папки связаны между собой в результате Branche, то выбрав одну из них, мы все изменения можем слить в другую (на картинке выше пункт merge):
В открывшемся окне мы можем выбрать в какую из веток выполнить слияние и указать, перенести все различия между ветками или можем выбрать конкретные наборы изменений которые необходимо перенести. Хранилище само определяет в чем заключается разница файлов хранящихся в ветках и вносит на машине пользователя необходимые изменения в локальные файлы. Т.к. в отличии от Brunch проходящего на сервере, Merge происходит на локальной машине и его нужно возвращать на сервер в рамках набора изменений. Это связано с тем, что при внесении изменений параллельно в двух ветках, при их слиянии могут возникнуть сложности с автоматическим объединением изменений в разных ветках одного и того же файла. И эти изменения придется выверять и подтверждать вручную.
Теперь о том, как мы эти ветки используем у себя.
Во-первых, у нас есть папка с набором базовых компонентов (Core). Эта папка размножается ветками в корневые папки всех крупных проектов. Делается это для того, чтобы при необходимости внести изменения (бывает очень редко, но бывает) в базовые компоненты, можно было эти изменения обкатать на том проекте которому они нужны. Слить эти изменения в исходную ветку, убедиться что в ней все хорошо и потом из коревой ветки слить изменения с веткой Core в остальных проектах. Т.к. во всех проектах настроены автоматические билды, то если в результате слияния изменений из Core в ветки проектов что-то пойдет не так, все разработчики узнают об этом сразу. Схематически это все выглядит вот так (картинки кликабельны):
Если еще не запутал, то во-вторых, ветки у нас применяются для разделения проекта. Разработка нового функционала ведется в основной папке проекта. Ближе к концу спринта, когда основной функционал реализован, все изменения перемещаются в заранее подготовленную ветку Prerelease. В этой ветке идет стабилизация версии перед релизом. После того, как QA дает отмашку на релиз, все изменения перемещаются в ветку Release и разворачиваются в эксплуатацию. Благодаря этим трем веткам всегда есть возможность спокойно проводить стабилизацию перед релизом, не опасаясь, того, что кто-то начнет писать новый функционал и сломает тот код, который в рамках стабилизации уже был подвергнут регрессу. Также, наличие ветки с кодом идентичным развернутому в Operation позволяет править ошибки обнаруженные в процессе эксплуатации именно в том коде, который эксплуатируется. И даже если в ветке разработки поправили модель данных или сломали вообще все, есть возможность внести минимальные изменения в стабильный код и развернуть его после проверки в эксплуатацию. Выглядит это примерно так:
Ну и объединяя две предыдущие картинки, схема веток Core и проектов будет выглядеть так:
На сегодня думаю хватит, а в следующий раз я тогда покажу как ветки связаны с тегами рабочих элементов и что приходится делать для некоторых из них.

Зачем нужны указатели в языке Си?

Зачем нужны указатели в языке Си?

 В блоге уже есть урок, рассказывающий об указателях. В том уроке я попытался подробно объяснить, что такое указатель и как с ним можно работать. Но забыл самое главное, то с чего стоило бы начать. И вдумчивые читатели быстро заметили этот мой недочет, и стали  задавать  логичные вопросы:«А зачем это всё? Зачем нужны указатели? Почему нам не работается с переменными? Нормально же всё было, ну чего ты начал-то? А?»
И правда, чего я начал-то?  Пора расставить точки над i. Итак, ниже несколько вариантов ответа на вопрос: «Зачем в Си нужны указатели?»

Ответ номер один.

Правила языка Си таковы, что без использования указателей некоторые вещи невозможно реализовать.
Умные слова хорошо, а наглядный пример еще лучше.
Напоминаю, что в языке Си переменные в функцию передаются «по значению».  Это обозначает, что когда мы вызываем функцию с какими-то параметрами, то в памяти создаются копии этих переменных и уже с ними работает функция. Когда функция заканчивает свою работу, эти копии уничтожаются.
И чем это нам мешает?
Ну, в принципе, тем, что мы не можем написать функцию, которая меняет значения двух переменных местами.  В принципе, я уже говорил об этой проблеме и даже приводил её решение, но как-то не акцентировал внимания на том, что без указателей написать такую функцию невозможно. Но чтобы всё было в одном месте, кратко повторюсь.
На первый взгляд кажется, что всё в порядке, но запустив следующую программу, легко убедиться, что написанная нами функция работает не так, как мы ожидаем.
#include <stdio.h>
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}

int main(){
int x = 3,y = 5;
        printf("x=%d \t y=%d \n",x,y);
        swap(x,y);
        printf("x=%d \t y=%d \n",x,y);
        return (0);
}


А ниже результат её работы.

Решение простое, использовать указатели. Т.е. передавать в функцию не копию переменной, а её адрес в памяти и работать уже непосредственно с этим адресом. Такой способ передачи аргументов в функцию, называется передача аргументов «по ссылке».
#include <stdio.h>
void swap (int *pi_a, int *pi_b){
//принимаем указатели на переменные типа int
      int temp = *pi_a;
      *pi_a = *pi_b;
      *pi_b = temp;
}
int main (){
      int x=3,y=5;
      printf("x=%d \t y=%d \n",x,y);
      // ВНИМАНИЕ!передаем адреса,
      //так как функция swap принимает указатели
      swap(&x,&y);
      printf("x=%d \t y=%d \n",x,y);
      return(0);
}

Результат работы программы с использование указателей:

Как видите, теперь функция работает так, как он неё требуется.

Ответ номер два.

Указатели позволяет эффективно использовать возможности и ресурсы компьютера.
Хотя ответ и другой, а причина всё та же. Передача аргументов в функцию. Я уже говорил выше, в функцию передаются копии переменных. Это правило не касается массивов. Массивы всегда передаются «по ссылке». Именно это и позволяет эффективно использовать ресурсы и возможности компьютера.
Представьте, что вы бы передавали массив из 10000 значений типа double по значению. То есть, при вызове функции программе нужно было бы найти достаточно места, чтобы сохранить такой объем данных. Причем места непрерывного, так как массивы, как вы должны помнить, располагаются в памяти последовательно. И, кроме того, необходимо было бы скопировать все элементы из одного массива в другой.
Такой подход занимал бы уйму времени и памяти, да и вообще, был бы невозможен при больших массивах. А так, мы передали указатель на первый элемент и радуемся. И не нужно много памяти искать, и копировать ничего не приходится.

Третий ответ.

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

Четвертый ответ.

Это ответ скорее относится к вопросу: «Зачем вам нужно знать указатели?», а не к изначальному вопросу: «Зачем указатели нужны в Си, в принципе?».
Ответ банальный и очевидный.
Язык Си устроен таким образом, что, не зная принципов работы с указателями, вы просто не сумеете использовать огромное количество его возможностей. 
Пример привести очень легко. Откройте справочник по функциям работы со строками в Си и внимательно посмотрите, что возвращают эти функции. Огромное их число возвращают в качестве результат своей работы указатели. А если вы о них ничего не знаете, как вы сможете их использовать? Да никак. 

Вот и всё на сегодня.

 Скачать текстовую версию урока.[pdf]

Зачем нужны указатели в языке Си?

Зачем нужны указатели в языке Си?

 В блоге уже есть урок, рассказывающий об указателях. В том уроке я попытался подробно объяснить, что такое указатель и как с ним можно работать. Но забыл самое главное, то с чего стоило бы начать. И вдумчивые читатели быстро заметили этот мой недочет, и стали  задавать  логичные вопросы:«А зачем это всё? Зачем нужны указатели? Почему нам не работается с переменными? Нормально же всё было, ну чего ты начал-то? А?»
И правда, чего я начал-то?  Пора расставить точки над i. Итак, ниже несколько вариантов ответа на вопрос: «Зачем в Си нужны указатели?»

Ответ номер один.

Правила языка Си таковы, что без использования указателей некоторые вещи невозможно реализовать.
Умные слова хорошо, а наглядный пример еще лучше.
Напоминаю, что в языке Си переменные в функцию передаются «по значению».  Это обозначает, что когда мы вызываем функцию с какими-то параметрами, то в памяти создаются копии этих переменных и уже с ними работает функция. Когда функция заканчивает свою работу, эти копии уничтожаются.
И чем это нам мешает?
Ну, в принципе, тем, что мы не можем написать функцию, которая меняет значения двух переменных местами.  В принципе, я уже говорил об этой проблеме и даже приводил её решение, но как-то не акцентировал внимания на том, что без указателей написать такую функцию невозможно. Но чтобы всё было в одном месте, кратко повторюсь.
На первый взгляд кажется, что всё в порядке, но запустив следующую программу, легко убедиться, что написанная нами функция работает не так, как мы ожидаем.
#include <stdio.h>
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}

int main(){
int x = 3,y = 5;
        printf("x=%d t y=%d n",x,y);
        swap(x,y);
        printf("x=%d t y=%d n",x,y);
        return (0);
}


А ниже результат её работы.

Решение простое, использовать указатели. Т.е. передавать в функцию не копию переменной, а её адрес в памяти и работать уже непосредственно с этим адресом. Такой способ передачи аргументов в функцию, называется передача аргументов «по ссылке».
#include <stdio.h>
void swap (int *pi_a, int *pi_b){
//принимаем указатели на переменные типа int
      int temp = *pi_a;
      *pi_a = *pi_b;
      *pi_b = temp;
}
int main (){
      int x=3,y=5;
      printf("x=%d t y=%d n",x,y);
      // ВНИМАНИЕ!передаем адреса,
      //так как функция swap принимает указатели
      swap(&x,&y);
      printf("x=%d t y=%d n",x,y);
      return(0);
}

Результат работы программы с использование указателей:

Как видите, теперь функция работает так, как он неё требуется.

Ответ номер два.

Указатели позволяет эффективно использовать возможности и ресурсы компьютера.
Хотя ответ и другой, а причина всё та же. Передача аргументов в функцию. Я уже говорил выше, в функцию передаются копии переменных. Это правило не касается массивов. Массивы всегда передаются «по ссылке». Именно это и позволяет эффективно использовать ресурсы и возможности компьютера.
Представьте, что вы бы передавали массив из 10000 значений типа double по значению. То есть, при вызове функции программе нужно было бы найти достаточно места, чтобы сохранить такой объем данных. Причем места непрерывного, так как массивы, как вы должны помнить, располагаются в памяти последовательно. И, кроме того, необходимо было бы скопировать все элементы из одного массива в другой.
Такой подход занимал бы уйму времени и памяти, да и вообще, был бы невозможен при больших массивах. А так, мы передали указатель на первый элемент и радуемся. И не нужно много памяти искать, и копировать ничего не приходится.

Третий ответ.

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

Четвертый ответ.

Это ответ скорее относится к вопросу: «Зачем вам нужно знать указатели?», а не к изначальному вопросу: «Зачем указатели нужны в Си, в принципе?».
Ответ банальный и очевидный.
Язык Си устроен таким образом, что, не зная принципов работы с указателями, вы просто не сумеете использовать огромное количество его возможностей. 
Пример привести очень легко. Откройте справочник по функциям работы со строками в Си и внимательно посмотрите, что возвращают эти функции. Огромное их число возвращают в качестве результат своей работы указатели. А если вы о них ничего не знаете, как вы сможете их использовать? Да никак. 

Вот и всё на сегодня.

 Скачать текстовую версию урока.[pdf]

[Mozilla] Выпущен первый браузер для разработчиков

Как и сообщалось ранее, Mozilla выпустила первый браузер, который создан специально для разработчиков. Несмотря на то, что официальный пресс-релиз о выходе новинки будет доступен 10 ноября, попробовать новый браузер можно уже сейчас. 



Стала известна новая информация о Firefox Developer Edition:



  • Firefox Developer Edition заменит собой уже существующий канал разработки Firefox Aurora. Таким образом, в сборку для разработчиков будут попадать нововведения из Firefox Nightly. Также сохранится шестинедельный цикл разработки браузера: Nightly — Developer Edition — Beta — Release. Тем самым, у разработчика будет 12 недель до того, как нововведение попадет в релиз;
  • Новый браузер будет использовать отдельный пользовательский профиль, что позволит запускать его одновременно с Firefox;
  • Обновленный интерфейс, ускоряющий доступ к средствам разработчика. По умолчанию включена темная тема оформления, но браузер поддерживает как переключение на стандартную тему, так и установку сторонних тем и расширений;
  • Экспериментальные средства разработки. В состав нового браузера включены средства разработки, которые пока находятся на раннем этапе развития. Одним из них стал Firefox Tools Adapter, который позволяет использовать средства разработки Firefox для отладки в других браузерах (Safari на iOS, Chrome на Android). Кроме того, в состав нового Firefox включен полезный инструмент WebIDE, о котором уже сообщалось ранее.

Больше информации о нововведениях и планах Mozilla по развитию браузера можно узнать 10 ноября 2014 года. 

Темная тема по умолчанию:

Firefox Developer Edition

Скачать Firefox Developer Edition можно с серверов Mozilla:

— Windows (en)
— OS X (en)
— Linux (en)Linux x86_64 (en)

Локализованные сборки (на русском языке):
— Windows (ru)
— OS X (ru)
— Linux (ru)Linux x64 (ru)

Оригинал статьи - http://habrahabr.ru/post/242363/
Инфа на opennet.ru - http://www.opennet.ru/opennews/art.shtml?num=41011

[Mozilla] Выпущен первый браузер для разработчиков

Как и сообщалось ранее, Mozilla выпустила первый браузер, который создан специально для разработчиков. Несмотря на то, что официальный пресс-релиз о выходе новинки будет доступен 10 ноября, попробовать новый браузер можно уже сейчас. 



Стала известна новая информация о Firefox Developer Edition:



  • Firefox Developer Edition заменит собой уже существующий канал разработки Firefox Aurora. Таким образом, в сборку для разработчиков будут попадать нововведения из Firefox Nightly. Также сохранится шестинедельный цикл разработки браузера: Nightly — Developer Edition — Beta — Release. Тем самым, у разработчика будет 12 недель до того, как нововведение попадет в релиз;
  • Новый браузер будет использовать отдельный пользовательский профиль, что позволит запускать его одновременно с Firefox;
  • Обновленный интерфейс, ускоряющий доступ к средствам разработчика. По умолчанию включена темная тема оформления, но браузер поддерживает как переключение на стандартную тему, так и установку сторонних тем и расширений;
  • Экспериментальные средства разработки. В состав нового браузера включены средства разработки, которые пока находятся на раннем этапе развития. Одним из них стал Firefox Tools Adapter, который позволяет использовать средства разработки Firefox для отладки в других браузерах (Safari на iOS, Chrome на Android). Кроме того, в состав нового Firefox включен полезный инструмент WebIDE, о котором уже сообщалось ранее.

Больше информации о нововведениях и планах Mozilla по развитию браузера можно узнать 10 ноября 2014 года. 

Темная тема по умолчанию:

Firefox Developer Edition

Скачать Firefox Developer Edition можно с серверов Mozilla:

— Windows (en)
— OS X (en)
— Linux (en)Linux x86_64 (en)

Локализованные сборки (на русском языке):
— Windows (ru)
— OS X (ru)
— Linux (ru)Linux x64 (ru)

Оригинал статьи - http://habrahabr.ru/post/242363/
Инфа на opennet.ru - http://www.opennet.ru/opennews/art.shtml?num=41011

О тегах в TFS


С появлением этой замечательной штуки в TFS убедить себя добавить полей к Work Item-ам стало значительно труднее. Под катом небольшая история о том, какие теги мы используем и для чего.

Сразу скажу, что тегов мы используем всего 7. Помечаются тегами только баги и PBI. Причем некоторые теги привязываются только к PBI, а некоторые только к Bug. Поехали.

NotReady
Этим тегом помечаются только PBI и только в основном бэклоге. Этот тег сообщает о недостаточной подготовке PBI. Как правило, это пометка о необходимости обсудить его с заказчиком.

added
Это тег тоже только для PBI, но уже в спринте. Им помечаются требования добавленные в спринт заказчиком после его начала, как правило с аргументацией: "А!!! Мы все умрем!!! Срочно!!!". Сразу оговорюсь, что ситуация хоть и плановая, но не массовая. По статистике за последние 40 спринтов, на 13-14 запланированных в начале спринта Effort приходится 1 Effort добавленный в итерации.

td
Этим тегом помечаются PBI которые можно отнести к классу технический долг. Т.е. в силу тех или иных причин был реализован функционал, пользователя он устраивает, но остались некоторые шероховатости в реализации. Например, был реализован показ пользователей некоторой системы, но т.к. список большой, он грузиться долго. Функционал есть и он работает, но в бэклог помещается PBI с указанным тегом и содержанием: переделать на постраничный вид.

unscheduled
Этот тег очень похож на added, и также вешается на PBI которые попали в итерацию после планирования, но, есть и отличие. Если в конце спринта кончились запланированные требования и закрыты все баги, а время еще есть, то вместо разброда и шатания, берется в спринт еще несколько PBI и они помечаются этим тегом. Позволяет проанализировать результативность планирования спринта. Правда, такое бывает очень редко, но если что, то такой тег у нас есть.

release
Этим тегом помечаются в основном баги, и он говорит об обнаружении ошибки в эксплуатации. У этого бага максимальный приоритет, он правиться в специальной ветке и после исправления и тестирования, исправление разворачивается на боевые сервера. Очень редко это тег ставиться на PBI, но это как правило небольшие изменения и в этом случае он идет еще и с тегом added.

доработка
Единственный тег на русском языке и первый из тех кто применяется только к багам. Появился для того, чтобы различать баги которые именно реализовано неправильно и те случаи когда разработчик не понял или понял неправильно требование. В последнее время появляется редко, но если появляется это очень существенный повод посмотреть что пошло не так.

prerelease
Применяется только к багам и говорит о том, что исправлять его нужно в ветке стабилизации перед релизом. Появляется только в конце спринта, когда вся разработка нового функционала завершена и идет именно стабилизация.

Теги появлялись не так, что бах и сразу все. По мере обнаружения ситуаций которые хотелось бы детектировать и принимать по ним решения. Часть тегов, как я уже писал в статье про Scrum доску нашли свое отражение даже в цвете. Пока все.
 

Кол-во приобретаемых единиц за один раз.

В данной репродукции скрипта появится возможность приобретения за 1 раз сразу нескольких деревьев.

По умолчанию, поле для ввода количества приобретаемой продукции, принимает значение "1". Предусмотрен вариант защиты и заглушки, при вводе в поле текста, или цифры "0".



Система выдаст информационное письмо, если данные введены неправильно. Скрипт подходит к стандартным фермам. При желании, его легко можно настроить. Оформление стандартное.

Стоимость - 120 руб.
Для приобретения свяжитесь со мной во внутреннем блоке комментариев к посту или на почту:
wh1skas@yahoo.com

Кол-во приобретаемых единиц за один раз.

В данной репродукции скрипта появится возможность приобретения за 1 раз сразу нескольких деревьев.

По умолчанию, поле для ввода количества приобретаемой продукции, принимает значение "1". Предусмотрен вариант защиты и заглушки, при вводе в поле текста, или цифры "0".



Система выдаст информационное письмо, если данные введены неправильно. Скрипт подходит к стандартным фермам. При желании, его легко можно настроить. Оформление стандартное.

Стоимость - 120 руб.
Для приобретения свяжитесь со мной во внутреннем блоке комментариев к посту или на почту:
wh1skas@yahoo.com